Вы определили foreign_keys
для отношения youngest_child
, но вы также должны определить его для отношений children
и parent
:
class Parent(Base):
__tablename__ = 'parents'
id = Column(Integer, primary_key=True)
youngest_child_id = Column(Integer, ForeignKey('children.id'))
youngest_child = relationship("Child", uselist=False, post_update=True,
foreign_keys=[youngest_child_id])
# Pass foreign_keys= as a Python executable string for lazy evaluation
children = relationship("Child", back_populates='parent',
foreign_keys='[Child.parent_id]')
class Child(Base):
__tablename__ = 'children'
id = id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parents.id'))
parent = relationship("Parent", back_populates='children',
foreign_keys=[parent_id])
Кроме того, вы должны определить post_update=True
, например, youngest_child
, чтобы разорвать круговую зависимость между моделями.Без этого SQLAlchemy пришлось бы вставлять одновременно и родителя, и потомка, если вы сделаете что-то вроде этого:
p = Parent()
c1, c2 = Child(), Child()
p.children = [c1, c2]
p.youngest_child = c1
session.add(p)
session.commit()
После установки обновления SQLAlchemy сначала вставляется в родителей, затем в детей,а затем обновляет родителя младшим ребенком.