谁能解释这两个想法的概念以及它们与表之间的关系的关系?我似乎真的找不到任何能清楚解释它的内容,并且文档觉得简单概念中的术语太多了。例如,在文档中的一对多关系示例中:
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()
函数在哪个类中是否存在? 最佳答案
backref
是一种快捷方式,用于仅在父类或子类(而不是两者)上的一个位置上同时配置parent.children
和child.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
。为什么Relation()放在父类中而ForeignKey放在子类中?
就像我上面说的,如果您使用
back_populates
,它需要同时在父类和子类上进行。如果使用backref
,则只需继续使用其中之一。无论ForeignKey
放在何处,relationship
都必须继续进行子类,这是关系数据库的基本概念。又有back_populates到底有什么作用呢?
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
如您所见,即使没有明确设置,
p1
仍被设置为c1
的父级。物质中是否存在Relationship()函数位于哪个类中?
这仅适用于
backref
,不可以,您可以将关系放在父类(children = relationship("Child", backref="parent")
)或子类(parent = relationship("Parent", backref="children")
)上,并具有完全相同的效果。关于python - SQLalchemy中的backref和back_populate概念?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51335298/