a collection of items represented by the child::
class Parent(Base):
- __tablename__ = "parent"
+ __tablename__ = "parent_table"
id = Column(Integer, primary_key=True)
children = relationship("Child")
class Child(Base):
- __tablename__ = "child"
+ __tablename__ = "child_table"
id = Column(Integer, primary_key=True)
- parent_id = Column(Integer, ForeignKey("parent.id"))
+ parent_id = Column(Integer, ForeignKey("parent_table.id"))
To establish a bidirectional relationship in one-to-many, where the "reverse"
side is a many to one, specify an additional :func:`_orm.relationship` and connect
the two using the :paramref:`_orm.relationship.back_populates` parameter::
class Parent(Base):
- __tablename__ = "parent"
+ __tablename__ = "parent_table"
id = Column(Integer, primary_key=True)
children = relationship("Child", back_populates="parent")
class Child(Base):
- __tablename__ = "child"
+ __tablename__ = "child_table"
id = Column(Integer, primary_key=True)
- parent_id = Column(Integer, ForeignKey("parent.id"))
+ parent_id = Column(Integer, ForeignKey("parent_table.id"))
parent = relationship("Parent", back_populates="children")
``Child`` will get a ``parent`` attribute with many-to-one semantics.
:paramref:`_orm.relationship.back_populates`::
class Parent(Base):
- __tablename__ = "parent"
+ __tablename__ = "parent_table"
id = Column(Integer, primary_key=True)
children = relationship("Child", backref="parent")
attribute will be created::
class Parent(Base):
- __tablename__ = "parent"
+ __tablename__ = "parent_table"
id = Column(Integer, primary_key=True)
- child_id = Column(Integer, ForeignKey("child.id"))
+ child_id = Column(Integer, ForeignKey("child_table.id"))
child = relationship("Child")
class Child(Base):
- __tablename__ = "child"
+ __tablename__ = "child_table"
id = Column(Integer, primary_key=True)
Bidirectional behavior is achieved by adding a second :func:`_orm.relationship`
in both directions::
class Parent(Base):
- __tablename__ = "parent"
+ __tablename__ = "parent_table"
id = Column(Integer, primary_key=True)
- child_id = Column(Integer, ForeignKey("child.id"))
+ child_id = Column(Integer, ForeignKey("child_table.id"))
child = relationship("Child", back_populates="parents")
class Child(Base):
- __tablename__ = "child"
+ __tablename__ = "child_table"
id = Column(Integer, primary_key=True)
parents = relationship("Parent", back_populates="child")
may be applied to a single :func:`_orm.relationship`, such as ``Parent.child``::
class Parent(Base):
- __tablename__ = "parent"
+ __tablename__ = "parent_table"
id = Column(Integer, primary_key=True)
- child_id = Column(Integer, ForeignKey("child.id"))
+ child_id = Column(Integer, ForeignKey("child_table.id"))
child = relationship("Child", backref="parents")
.. _relationships_one_to_one:
relationships::
class Parent(Base):
- __tablename__ = "parent"
+ __tablename__ = "parent_table"
id = Column(Integer, primary_key=True)
# one-to-many collection
class Child(Base):
- __tablename__ = "child"
+ __tablename__ = "child_table"
id = Column(Integer, primary_key=True)
- parent_id = Column(Integer, ForeignKey("parent.id"))
+ parent_id = Column(Integer, ForeignKey("parent_table.id"))
# many-to-one scalar
parent = relationship("Parent", back_populates="children")
renaming ``Parent.children`` to ``Parent.child`` for clarity::
class Parent(Base):
- __tablename__ = "parent"
+ __tablename__ = "parent_table"
id = Column(Integer, primary_key=True)
# previously one-to-many Parent.children is now
class Child(Base):
- __tablename__ = "child"
+ __tablename__ = "child_table"
id = Column(Integer, primary_key=True)
- parent_id = Column(Integer, ForeignKey("parent.id"))
+ parent_id = Column(Integer, ForeignKey("parent_table.id"))
# many-to-one side remains, see tip below
parent = relationship("Parent", back_populates="child")
class Parent(Base):
- __tablename__ = "parent"
+ __tablename__ = "parent_table"
id = Column(Integer, primary_key=True)
class Child(Base):
- __tablename__ = "child"
+ __tablename__ = "child_table"
id = Column(Integer, primary_key=True)
- parent_id = Column(Integer, ForeignKey("parent.id"))
+ parent_id = Column(Integer, ForeignKey("parent_table.id"))
parent = relationship("Parent", backref=backref("child", uselist=False))
.. _relationships_many_to_many:
remote tables with which to link::
association_table = Table(
- "association",
+ "association_table",
Base.metadata,
- Column("left_id", ForeignKey("left.id")),
- Column("right_id", ForeignKey("right.id")),
+ Column("left_id", ForeignKey("left_table.id")),
+ Column("right_id", ForeignKey("right_table.id")),
)
class Parent(Base):
- __tablename__ = "left"
+ __tablename__ = "left_table"
id = Column(Integer, primary_key=True)
children = relationship("Child", secondary=association_table)
class Child(Base):
- __tablename__ = "right"
+ __tablename__ = "right_table"
id = Column(Integer, primary_key=True)
.. tip::
of issues on the application side::
association_table = Table(
- "association",
+ "association_table",
Base.metadata,
- Column("left_id", ForeignKey("left.id"), primary_key=True),
- Column("right_id", ForeignKey("right.id"), primary_key=True),
+ Column("left_id", ForeignKey("left_table.id"), primary_key=True),
+ Column("right_id", ForeignKey("right_table.id"), primary_key=True),
)
For a bidirectional relationship, both sides of the relationship contain a
for each :func:`_orm.relationship` specify the common association table::
association_table = Table(
- "association",
+ "association_table",
Base.metadata,
- Column("left_id", ForeignKey("left.id"), primary_key=True),
- Column("right_id", ForeignKey("right.id"), primary_key=True),
+ Column("left_id", ForeignKey("left_table.id"), primary_key=True),
+ Column("right_id", ForeignKey("right_table.id"), primary_key=True),
)
class Parent(Base):
- __tablename__ = "left"
+ __tablename__ = "left_table"
id = Column(Integer, primary_key=True)
children = relationship(
"Child", secondary=association_table, back_populates="parents"
class Child(Base):
- __tablename__ = "right"
+ __tablename__ = "right_table"
id = Column(Integer, primary_key=True)
parents = relationship(
"Parent", secondary=association_table, back_populates="children"
reverse relationship::
association_table = Table(
- "association",
+ "association_table",
Base.metadata,
- Column("left_id", ForeignKey("left.id"), primary_key=True),
- Column("right_id", ForeignKey("right.id"), primary_key=True),
+ Column("left_id", ForeignKey("left_table.id"), primary_key=True),
+ Column("right_id", ForeignKey("right_table.id"), primary_key=True),
)
class Parent(Base):
- __tablename__ = "left"
+ __tablename__ = "left_table"
id = Column(Integer, primary_key=True)
children = relationship("Child", secondary=association_table, backref="parents")
class Child(Base):
- __tablename__ = "right"
+ __tablename__ = "right_table"
id = Column(Integer, primary_key=True)
The :paramref:`_orm.relationship.secondary` argument of
available to the callable after all module initialization is complete::
class Parent(Base):
- __tablename__ = "left"
+ __tablename__ = "left_table"
id = Column(Integer, primary_key=True)
children = relationship(
"Child",
is accepted as well, matching the name of the table as stored in ``Base.metadata.tables``::
class Parent(Base):
- __tablename__ = "left"
+ __tablename__ = "left_table"
id = Column(Integer, primary_key=True)
- children = relationship("Child", secondary="association", backref="parents")
+ children = relationship("Child", secondary="association_table", backref="parents")
.. warning:: When passed as a Python-evaluable string, the
:paramref:`_orm.relationship.secondary` argument is interpreted using Python's
``Child``::
class Association(Base):
- __tablename__ = "association"
- left_id = Column(ForeignKey("left.id"), primary_key=True)
- right_id = Column(ForeignKey("right.id"), primary_key=True)
+ __tablename__ = "association_table"
+ left_id = Column(ForeignKey("left_table.id"), primary_key=True)
+ right_id = Column(ForeignKey("right_table.id"), primary_key=True)
extra_data = Column(String(50))
child = relationship("Child")
class Parent(Base):
- __tablename__ = "left"
+ __tablename__ = "left_table"
id = Column(Integer, primary_key=True)
children = relationship("Association")
class Child(Base):
- __tablename__ = "right"
+ __tablename__ = "right_table"
id = Column(Integer, primary_key=True)
As always, the bidirectional version makes use of :paramref:`_orm.relationship.back_populates`
or :paramref:`_orm.relationship.backref`::
class Association(Base):
- __tablename__ = "association"
- left_id = Column(ForeignKey("left.id"), primary_key=True)
- right_id = Column(ForeignKey("right.id"), primary_key=True)
+ __tablename__ = "association_table"
+ left_id = Column(ForeignKey("left_table.id"), primary_key=True)
+ right_id = Column(ForeignKey("right_table.id"), primary_key=True)
extra_data = Column(String(50))
child = relationship("Child", back_populates="parents")
parent = relationship("Parent", back_populates="children")
class Parent(Base):
- __tablename__ = "left"
+ __tablename__ = "left_table"
id = Column(Integer, primary_key=True)
children = relationship("Association", back_populates="parent")
class Child(Base):
- __tablename__ = "right"
+ __tablename__ = "right_table"
id = Column(Integer, primary_key=True)
parents = relationship("Association", back_populates="child")
after :meth:`.Session.commit`::
class Association(Base):
- __tablename__ = "association"
+ __tablename__ = "association_table"
- left_id = Column(ForeignKey("left.id"), primary_key=True)
- right_id = Column(ForeignKey("right.id"), primary_key=True)
+ left_id = Column(ForeignKey("left_table.id"), primary_key=True)
+ right_id = Column(ForeignKey("right_table.id"), primary_key=True)
extra_data = Column(String(50))
child = relationship("Child", backref="parent_associations")
class Parent(Base):
- __tablename__ = "left"
+ __tablename__ = "left_table"
id = Column(Integer, primary_key=True)
- children = relationship("Child", secondary="association")
+ children = relationship("Child", secondary="association_table")
class Child(Base):
- __tablename__ = "right"
+ __tablename__ = "right_table"
id = Column(Integer, primary_key=True)
Additionally, just as changes to one relationship aren't reflected in the
parameter::
keyword_author = Table(
- "keyword_author",
+ "keyword_author_table",
Base.metadata,
- Column("author_id", Integer, ForeignKey("authors.id")),
- Column("keyword_id", Integer, ForeignKey("keywords.id")),
+ Column("author_id", Integer, ForeignKey("authors_table.id")),
+ Column("keyword_id", Integer, ForeignKey("keywords_table.id")),
)
class Author(Base):
- __tablename__ = "authors"
+ __tablename__ = "authors_table"
id = Column(Integer, primary_key=True)
- keywords = relationship("Keyword", secondary="keyword_author")
+ keywords = relationship("Keyword", secondary="keyword_author_table")
For additional detail on many-to-many relationships see the section
:ref:`relationships_many_to_many`.