0

對於我正在試驗的數據庫,建議將MatchTeam之間的關係從M2M更改爲兩個1對1關係。邏輯:每場比賽只有兩支球隊。SQLAlchemy:Double一對一關係聲明

我不知道如何在我的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 S IN的Match側的聲明。

回答

0

的解決方案是爲每一個關係引用添加到一個關係,並使用relationshipforeign_keys參數,來指定要使用的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關係,因爲它是在這裏沒用,恕我直言。

相關文檔在這裏:http://docs.sqlalchemy.org/en/latest/orm/join_conditions.html#relationship-foreign-keys