假设我正在模拟邮政地址更改。我希望每个AddressChange
与before
建立Address
关系,并与另一个after
建立Address
关系。我希望从Address
返回与AddressChange
关联的参考。
class AddressChange(Base):
__tablename__ = 'AddressChanges'
id = Column(Integer, primary_key=True)
before_id = Column(Integer, ForeignKey('Addresses.id'))
before = relationship('Address', foreign_keys=before_id, uselist=False,
back_populates='change')
after_id = Column(Integer, ForeignKey('Addresses.id'))
after = relationship('Address', foreign_keys=after_id, uselist=False,
back_populates='change')
class Address(Base):
__tablename__ = 'Addresses'
id = Column(Integer, primary_key=True)
street, city, etc = Column(String), Column(String), Column(String)
change = relationship('AddressChange')
然而,SQLAlchemy抱怨道:
无法确定关系Address.change上的父/子表之间的连接条件 - 有多个链接表的外键路径。指定'foreign_keys'参数,提供应列为包含父表的外键引用的列的列表。
我的Address
没有拥有对父表的外键引用,而且我不清楚为什么它需要一个。如果我加一个,我得
Address.change和back-reference AddressChange.before都是相同的方向符号('MANYTOONE')。你的意思是在多对一方设置remote_side吗?
这开始变得令人困惑,因为remote_side
的文档是针对“自引用关系的。”
答案 0 :(得分:1)
感谢@ alex-grönholm帮助#sqlalchemy。
这可以通过在primaryjoin
的关系中添加Address
参数来解决,以教会它如何映射回父AddressChange
:
change = relationship('AddressChange', uselist=False,
viewonly=True,
primaryjoin=or_(
AddressChange.before_id == id,
AddressChange.after_id == id
))