创建一个具有多对多关系的对象
问题描述:
如何初始化组对象的成员列表(并且用户必须知道他们是其中的组的成员)的组对象)?创建一个具有多对多关系的对象
用户有很多组。组有许多用户。
我也尝试过用户类中的add_to_group
方法,但那并没有真正实现。
这是我第一次处理多对多的关系,所以我还没有想出如何做到这一点,所有SO帖子都提到了查询多对多关系,而不是创建对象使用它们。
class User(db.Model):
__tablename__ = 'User'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique = False, nullable = False)
username = db.Column(db.String(80), unique = True, nullable = False)
fb_id = db.Column(db.String(80), unique = True, nullable = False)
groups = db.relationship('Groups', secondary=groups, backref=db.backref('User', lazy='dynamic'))
groups = db.Table('groups',
db.Column('group_id', db.Integer, db.ForeignKey('Group.id')),
db.Column('user_id', db.Integer, db.ForeignKey('User.id'))
)
class Group(db.Model):
__tablename__ = 'Group'
id = db.Column(db.Integer, primary_key=True)
last_updated = db.Column(db.DateTime, mutable=True)
def __init__(self):
self.last_updated = datetime.utcnow();
谢谢!
答
在SQLAlchemy中,多对多关系被建模为其值为列表的属性。
u = User()
g = [Group(), Group(), Group()]
u.groups = g
您还可以改变就地名单:
g1 = Group()
u.groups.append(g)
关系的另一面可能会以同样的方式工作:
g.users.append(User())
当你改变的一面一个多对多的关系,SQLAlchemy保持对方最新 - 换句话说,如果你从Group
的users
列表中删除User
,那么这个列表t Group
将不再出现在User
的groups
列表中。
+0
好的谢谢。说实话,我实际上是通过阅读SQLAlchemy文档而不是Flask-SQLAlchemy文档(我在发布之前读过的)来理解这一点,而我正在等待某人回复。但感谢您的帮助! – GangstaGraham 2013-03-02 22:09:12
db.backref()的第一个参数是backref属性应该采用的名称,而不是映射类的名称。因此,为了保持一致性,您可能需要将其从“用户”更改为“用户”。这将在“Group”类的每个实例上创建一个名为'users'的属性。 – 2013-03-02 21:53:15
另外,'db.relationship'的第一个参数_is_是关系另一端的类的名称,因此您需要用'Group'替换'Groups'。 – 2013-03-02 21:54:45
好的谢谢你的提示。将在我的代码中进行适当的更改。 – GangstaGraham 2013-03-02 22:06:24