如何在 SQLAlchemy 中使用 back_populates() 与同一个表中的两个(或更多)外键?

问题描述 投票:0回答:1

我有三个表:竞争对手、竞赛和决斗。

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()
连接关系?

python postgresql sqlalchemy orm flask-sqlalchemy
1个回答
0
投票

经过一番思考,我在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

。现在可以了。

    

© www.soinside.com 2019 - 2024. All rights reserved.