首页 > 解决方案 > 如何设置 SQLAlchemy 关系,以便两个表彼此具有多个关系?

问题描述

我正在尝试使用 SQLAlchemy 在 Web 应用程序中代表俱乐部和用户。用户必须有俱乐部列表,俱乐部必须有用户列表。我认为我通过多对多关系正确地做到了这一点,因为用户可以在多个俱乐部中。但是,我不能成为俱乐部领袖。这个想法是一个领导者应该仍然能够领导多个俱乐部,但每个俱乐部只有一个领导者。

我尝试过组合不同的关系组合,但根本无法添加领导者。

user_club_assoc_table = db.Table('user_club_assoc_table',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('club_id', db.Integer, db.ForeignKey('club.id')))

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    firstname = db.Column(db.String(15), nullable=False)
    lastname = db.Column(db.String(15), nullable=False)
    email = db.Column(db.String(60), unique=True, nullable=False)
    password = db.Column(db.String(60), nullable=False)
    clubs = db.relationship('Club', secondary=user_club_assoc_table)


class Club(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), unique=True, nullable=False)
    members = db.relationship('User', secondary=user_club_assoc_table)
    # This is what is needed
    # preferably be able to get all clubs being led by leader
    leader = db.relationship(...)

我希望能够创建用户并创建俱乐部。俱乐部应在实例化时将将成为领导者的用户作为参数。

标签: pythonsqlalchemyflask-sqlalchemy

解决方案


这两条评论将带你去你需要去的地方。建议代码:

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    # ...
    clubs = db.relationship('Club', secondary=user_club_assoc_table,
                            backref=db.backref('members', lazy='dynamic'))

class Club(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), unique=True, nullable=False)

    leader_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    leader = db.relationship('User', primaryjoin='club.leader_id == user.id')

推荐阅读