Python 如何设置SQLAlchemy关系,使两个表彼此具有多个关系?

Python 如何设置SQLAlchemy关系,使两个表彼此具有多个关系?,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,我正在尝试使用SQLAlchemy在web应用程序中代表俱乐部和用户。用户必须有一个俱乐部列表,俱乐部必须有一个用户列表。我认为我通过多对多关系正确地做到了这一点,因为用户可以在多个俱乐部中。 然而,我不能成为俱乐部的领袖。这个想法是一个领导者应该仍然能够领导多个俱乐部,但每个俱乐部只有一个领导者 我曾尝试将不同的关系组合在一起,但根本无法添加领导者 user_club_assoc_table = db.Table('user_club_assoc_table', db.Column('

我正在尝试使用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(...)

我希望能够创建用户和俱乐部。当俱乐部被实例化时,它应该把一个将成为领导者的用户作为一个参数。

这两条评论将帮助你找到你需要去的地方。建议代码:

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')

可能的重复在您的SQL架构中似乎没有任何东西可以确定哪个用户是俱乐部的领导者,因此ORM关系的定义将有点困难。当我现在尝试创建帐户时,我收到一个以
sqlalchemy.exc.InvalidRequestError结尾的长错误:一个或多个映射程序未能初始化-无法继续初始化其他映射程序。触发映射器:“映射类俱乐部->俱乐部”。最初的例外是:“Table”对象没有属性“advisor\u id”
其中advisor是leader,但重命名了您是否已将数据库升级到新架构?看起来我已经升级了。我已经做了一些测试,似乎任何时候出现查询都会出现错误。首先,它发生在注册表单的
validate\u email()
下,我在这里执行
user=user.query.filter\u by(email=email.data).First()
。如果我提前返回,那么错误将移动到
load\u user()
,这是在models.py中使用flask login定义的。在那里,查询是
User.query.get(User\u id)