python - 如何设置 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(...)
我希望能够创建用户并创建俱乐部。俱乐部应在实例化时将将成为领导者的用户作为参数。
解决方案
这两条评论将带你去你需要去的地方。建议代码:
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')
推荐阅读
- python - ssl_options Jupyter Notebook 中缺少密钥“certfile”
- python - 具有重叠问题的特定模式包围的序列的正则表达式
- bash - 如何获得当前的“焦点”OSX 桌面编号?
- python - Python字典和数组,如何将数组放入字典?
- r - 创建一个集成到 R 中的函数
- ros - 收到消息时如何终止 ros spin
- android - Flutter 中的 TextArea 格式化
- sql - 索引提示中指定的 Oracle 索引无效
- r - 将按钮放在闪亮仪表板的标题中时标题样式不起作用
- sparql - SPARQL 中用于操作 IRI 的函数?