返回引用和返回填充的概念? ?

有人能解释一下这两个概念的概念以及它们与表之间的关系有什么关系吗?我似乎真的找不到任何东西能够清楚地解释它,而且文档感觉在简单的概念中有太多的术语需要理解。例如,在文档中的这个一对多关系的示例中:

class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
children = relationship("Child", back_populates="parent")


class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id'))
parent = relationship("Parent", back_populates="children")

为什么 relationship()放在父类中,而 ForeignKey放在子类中?那么 back_populates到底对彼此有什么影响呢?relationship()函数在物质中是否存在哪个类的位置?

22223 次浏览

backref是仅在父类或子类(不是两者)上的一个位置配置 parent.childrenchild.parent relationship的快捷方式。也就是说,没有

children = relationship("Child", back_populates="parent")  # on the parent class

还有

parent = relationship("Parent", back_populates="children")  # on the child class

你只需要其中一个:

children = relationship("Child", backref="parent")  # only on the parent class

或者

parent = relationship("Parent", backref="children")  # only on the child class

children = relationship("Child", backref="parent")将自动在子类上创建 .parent关系。另一方面,如果使用 back_populates,则 必须的将在父类和子类中显式创建 relationship

为什么关系()在父类中,而 ForeignKey 在子类中?

如上所述,如果您使用 back_populates,那么它需要同时适用于父类和子类。如果使用 backref,它只需要在其中一个上运行。无论 relationship放在哪里,ForeignKey都需要放在子类上,这是关系数据库的基本概念。

那么,返回人口到底对彼此有什么影响呢?

back_populates通知每个关系关于另一个,以便它们保持同步

p1 = Parent()
c1 = Child()
p1.children.append(c1)
print(p1.children)  # will print a list of Child instances with one element: c1
print(c1.parent)  # will print Parent instance: p1

正如您所看到的,即使没有显式地设置 p1p1也被设置为 c1的父级。

关系()函数是否存在于物质中

这只适用于 backref,不,您可以将关系放置在父类(children = relationship("Child", backref="parent"))或子类(parent = relationship("Parent", backref="children"))上,并具有完全相同的效果。

更新: 2022年7月

显然,使用带有显式 关系()构造的 返回 _ 人口应该作为 解释如下:

Https://docs.sqlalchemy.org/en/14/orm/backref.html