我有三个表:竞争对手、竞赛和决斗。
class Competitor(db.Model): # type: ignore
__tablename__ = 'competitors'
id_competitor = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(255), nullable=False)
class Duel(db.Model): # type: ignore
__tablename__ = 'duels'
id_competitor1 = db.Column(db.ForeignKey('competitors.id_competitor'), primary_key=True)
id_competitor2 = db.Column(db.ForeignKey('competitors.id_competitor'), primary_key=True)
id_competition = db.Column(db.ForeignKey('competitions.id_competition'), primary_key=True)
phase = db.Column(db.Integer, primary_key=True)
rel_competition = relationship('Competition', back_populates='rel_competition_duel')
rel_competitor1 = relationship('Competitor', foreign_keys=[id_competitor1])
rel_competitor2 = relationship('Competitor', foreign_keys=[id_competitor2])
class Competition(db.Model): # type: ignore
__tablename__ = 'competitions'
id_competition = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(255), nullable=False)
rel_competition_duel = relationship('Duel', back_populates='rel_competition')
可以看到,Duel中有两个外键引用表Competitor。这就是有效的方法。
但是,我想将关系与
back_populates()
连接起来,以便修改其中一个也会修改另一个。
如果我用这两种关系替换决斗中的两种关系:
rel_competitor1 = relationship('Competitor', back_populates='rel_duel1')
rel_competitor2 = relationship('Competitor', back_populates='rel_duel2')
并添加:
rel_duel1 = relationship('Duel', back_populates='rel_competitor1')
rel_duel2 = relationship('Duel', back_populates='rel_competitor2')
致竞争对手,我收到错误:“
[..] Original exception was: Could not determine join condition between parent/child tables on relationship Competitor.rel_duel1 - there are multiple foreign key paths linking the tables. Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference to the parent table.
”
那么,当我有来自同一个表的两个(或可能更多)外键时,如何与
back_populates()
连接关系?
经过一番思考,我在Duel中添加了外键,但仍然产生错误。因此,经过一些阅读和搜索后,我意识到我需要在决斗和竞争对手中为“两者”关系添加外键。 所以,最终的解决方案是添加:
rel_duel1 = relationship('Duel', back_populates='rel_competitor1', foreign_keys='Duel.id_competitor1')
rel_duel2 = relationship('Duel', back_populates='rel_competitor2', foreign_keys='Duel.id_competitor2')
到
Competitor
,以及:
rel_competitor1 = relationship('Competitor', back_populates='rel_duel1', foreign_keys=[id_competitor1])
rel_competitor2 = relationship('Competitor', back_populates='rel_duel2', foreign_keys=[id_competitor2])
到
Duel
。现在可以了。