0

Für eine Datenbank, mit der ich experimentiere, wurde mir geraten, die Beziehung zwischen Match und Team von M2M in zwei 1-zu-1-Beziehungen zu ändern. Die Logik: Es gibt nur zwei Mannschaften für jedes gegebene Match.SQLAlchemy: Doppelte Eins-zu-Eins-Beziehungserklärung

Ich habe eine harte Zeit mit meinem Kopf um, wie man dies in meinem models.py implementieren; hier ist das, was ich bisher (verkürzt) bekam:

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) 

Es scheint hier etwas zu fehlen, vor allem in der Erklärung von relationship s in der Match Seite.

Antwort

0

Die Lösung ist, die eine Beziehung Referenz für jeden 00.59 Beziehung hinzuzufügen und zu verwenden, um das foreign_keys Argument der relationship, um anzugeben, welche die Kennung zu verwenden:

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 

I die match Beziehung entfernt worden, wie es ist nicht nützlich hier, IMHO.

Relevante Dokumentation ist hier: http://docs.sqlalchemy.org/en/latest/orm/join_conditions.html#relationship-foreign-keys