与三个表的多对多关系(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()