Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 三表多对多关系(sql炼金术)_Python_Flask_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Python 三表多对多关系(sql炼金术)

Python 三表多对多关系(sql炼金术),python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我正在努力让多对多的关系发挥作用。我有三张桌子 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.Co

我正在努力让多对多的关系发挥作用。我有三张桌子

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”

所以我想这不是实现这种关系的正确方式。 有没有正确的方法? 谢谢
卡尔

也许实现这一点的更简单的方法如下(改编自《炼金术》

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)
与其使用连接表(成员)的模型,不如使用一个简单的表

通过此配置,您可以轻松添加/删除成员和组:

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

也许实现这一点的一个更简单的方法如下(改编自on-alchemy

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)
与其使用连接表(成员)的模型,不如使用一个简单的表

通过此配置,您可以轻松添加/删除成员和组:

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