与三个表的多对多关系(sql-alchemy)
many to many relationship with three tables (sql-alchemy)
我正在尝试建立多对多关系。我有三张桌子
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
class Groups(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(1000))
class Members(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
group_id = db.Column(db.Integer, db.ForeignKey('groups.id'))
我想要选项 group.members,它应该给我所有属于该组成员的用户对象。我是按照下面的方式实现的
members = db.relationship('User', secondary="join(Members, User, Members.user_id == User.id)", primaryjoin="and_(Groups.id == Members.group_id)")
这似乎可行,但是当我删除一个组时,它(有时)会给我错误
AttributeError: 'Join' 对象没有属性 'delete'
所以我想这不是实现这种关系的正确方法。
任何想法如何正确地做到这一点?
谢谢
卡尔
也许更简单的实现方法如下(改编自 documentation on Flask-SQLAlchemy
members = db.Table('members',
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('group_id', db.Integer, db.ForeignKey('groups.id'))
)
class Groups(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(1000))
members = db.relationship('User', secondary=members, backref=db.backref('group', lazy='dynamic'))
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
我们不使用模型来加入 table(成员),而是使用简单的 table。
使用此配置,您可以轻松 add/remove 成员和群组:
u = User(username='matt')
g = Groups(name='test')
db.session.add(u)
db.session.add(g)
db.session.commit()
g.members.append(u)
db.session.commit()
db.session.delete(g)
db.session.commit()
我正在尝试建立多对多关系。我有三张桌子
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
class Groups(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(1000))
class Members(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
group_id = db.Column(db.Integer, db.ForeignKey('groups.id'))
我想要选项 group.members,它应该给我所有属于该组成员的用户对象。我是按照下面的方式实现的
members = db.relationship('User', secondary="join(Members, User, Members.user_id == User.id)", primaryjoin="and_(Groups.id == Members.group_id)")
这似乎可行,但是当我删除一个组时,它(有时)会给我错误
AttributeError: 'Join' 对象没有属性 'delete'
所以我想这不是实现这种关系的正确方法。 任何想法如何正确地做到这一点? 谢谢 卡尔
也许更简单的实现方法如下(改编自 documentation on Flask-SQLAlchemy
members = db.Table('members',
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('group_id', db.Integer, db.ForeignKey('groups.id'))
)
class Groups(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(1000))
members = db.relationship('User', secondary=members, backref=db.backref('group', lazy='dynamic'))
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
我们不使用模型来加入 table(成员),而是使用简单的 table。
使用此配置,您可以轻松 add/remove 成员和群组:
u = User(username='matt')
g = Groups(name='test')
db.session.add(u)
db.session.add(g)
db.session.commit()
g.members.append(u)
db.session.commit()
db.session.delete(g)
db.session.commit()