SQLAlchemy:双OnetoOne关系声明

2024-04-20 14:07:22 发布

您现在位置:Python中文网/ 问答频道 /正文

对于我正在试验的数据库,建议我将MatchTeam之间的关系从M2M改为两个1对1关系。逻辑是:每场比赛只有两个队。你知道吗

如何在我的models.py中实现这一点让我绞尽脑汁;以下是我目前得到的(节略):

class Match(db.Model):
    id = db.Column(db.String, primary_key=True)


    # One to One x2 with Team
    hometeam_id = db.Column(db.Integer, db.ForeignKey('team.id'))
    awayteam_id = db.Column(db.Integer, db.ForeignKey('team.id'))
    team = db.relationship("Team", back_populates="match")

    hoemteam_goals = db.Column(db.Integer, nullable=False)
    awayteam_goals = db.Column(db.Integer, nullable=False)

class Team(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)
    points = db.Column(db.Integer)
    matches_played = db.Column(db.Integer)

    # Many side of M2M With Match
    match = relationship("Match", back_populates="team", uselist=False)

这里似乎缺少一些东西,特别是在relationship侧的Match声明中。你知道吗


Tags: idfalsedbstringmodel关系matchcolumn
1条回答
网友
1楼 · 发布于 2024-04-20 14:07:22

解决方案是为每个一对一关系添加一个关系引用,并使用foreign_keysrelationship参数来指定要使用的id:

class Match(db.Model):
    id = db.Column(db.String, primary_key=True)

    # One to One x2 with Team
    hometeam_id = db.Column(db.Integer, db.ForeignKey('team.id'))
    awayteam_id = db.Column(db.Integer, db.ForeignKey('team.id'))
    hometeam = db.relationship("Team", foreign_keys=[hometeam_id])
    awayteam = db.relationship("Team", foreign_keys=[awayteam_id])

class Team(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)
    points = db.Column(db.Integer)
    matches_played = db.Column(db.Integer)

    # No backreferences, use a query to figure that out

我删除了match关系,因为它在这里没有用,IMHO。你知道吗

相关文档如下:http://docs.sqlalchemy.org/en/latest/orm/join_conditions.html#relationship-foreign-keys

相关问题 更多 >