【问题标题】:Flask SQLAlchemy many-to-many relationship issueFlask SQLAlchemy 多对多关系问题
【发布时间】:2021-06-07 13:55:28
【问题描述】:

我在 Flask SQLAlchemy 中的多对多关系存在问题。我对它的工作原理有一个大致的了解,但我似乎无法理解我的示例。 我正在制作一个网球记分应用程序,我目前有两个模型,Player 和 Score 以及中间表 Match(玩家可以互相挑战并跟踪他们参加的比赛)。问题是我的中间表有三列指向 Player 类中的同一列(玩家 id),我不知道如何制作关系列。到目前为止我的代码如下:

match = db.Table("match",
    db.Model.metadata,
    db.Column("id", db.Integer, primary_key=True),
    db.Column("player1", db.Integer, db.ForeignKey("players.id")),
    db.Column("player2", db.Integer, db.ForeignKey("players.id")),
    db.Column("score", db.Integer, db.ForeignKey("scores.id")),
    db.Column("winner", db.Integer, db.ForeignKey("players.id"))
    )

class Player(db.Model):
    __tablename__ = "players"
    id = db.Column(db.Integer, primary_key=True)
    fullname = db.Column(db.String)
    # scores = db.relationship("Score", secondary=match)

class Score(db.Model):
    __tablename__ = "scores"
    id = db.Column(db.Integer, primary_key=True)
    score = db.Column(db.String)
    date = db.Column(db.String)
    # players = db.relationship("Player", secondary=match)

我知道我应该将 Player 和 Score 类中的关系显示到匹配表(注释掉的部分),但如果我尝试创建它,它会给我以下错误:

“AmbiguousForeignKeysError:无法确定关系 Player.scores 上的父/子表之间的连接条件 - 有多个外键路径通过辅助表“匹配”链接表。指定“外键”参数,提供这些表的列表应计为包含从辅助表到每个父表和子表的外键引用的列。"

如果我在没有“分数”和“玩家”列的情况下创建它,它会很好地创建它,但是我无法查询中间表或向其中添加行。 (或者如果可能的话,我真的不知道怎么做)

有人可以解释我做错了什么吗?总的来说,我了解多对多关系应该如何工作,但我就是无法理解我应该在这里做什么。 困惑地尖叫

【问题讨论】:

    标签: many-to-many flask-sqlalchemy


    【解决方案1】:

    所以我找到了我的问题的答案,我将把它留在这里,以防它帮助其他人在同样的问题上苦苦挣扎...... 所以我试图使用一个辅助表,但这只是为了包含外键,但是我的关系表有其他数据(id、score、winner ...)这将它变成了一个基于关联对象的多对多关系.这需要将关系从 Parent 映射到 Association 对象,而不是直接映射到子对象。

     class Association(Base):
        __tablename__ = 'association'
        left_id = Column(Integer, ForeignKey('left.id'), primary_key=True)
        right_id = Column(Integer, ForeignKey('right.id'), primary_key=True)
        extra_data = Column(String(50))
    
        parent = db.relationship("Child", back_populates="children")
        child = db.relationship("Parent", back_populates="parents")
    
    
    class Parent(Base):
        __tablename__ = 'left'
        id = Column(Integer, primary_key=True)
        children = relationship("Association", back_populates="parent")
    
    class Child(Base):
        __tablename__ = 'right'
        id = Column(Integer, primary_key=True)
    
        parents = db.relationship("Association", back_populates="child")
    

    【讨论】:

      猜你喜欢
      • 2016-06-15
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 2018-09-07
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      相关资源
      最近更新 更多