2013-03-02 123 views
1

如何初始化组对象的成员列表(并且用户必须知道他们是其中的组的成员)的组对象)创建一个具有多对多关系的对象

用户有很多组。组有许多用户。

我也尝试过用户类中的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(); 

谢谢!

+0

db.backref()的第一个参数是backref属性应该采用的名称,而不是映射类的名称。因此,为了保持一致性,您可能需要将其从“用户”更改为“用户”。这将在“Group”类的每个实例上创建一个名为'users'的属性。 – 2013-03-02 21:53:15

+0

另外,'db.relationship'的第一个参数_is_是关系另一端的类的名称,因此您需要用'Group'替换'Groups'。 – 2013-03-02 21:54:45

+0

好的谢谢你的提示。将在我的代码中进行适当的更改。 – GangstaGraham 2013-03-02 22:06:24

回答

3

在SQLAlchemy中,多对多关系被建模为其值为列表的属性。

u = User() 
g = [Group(), Group(), Group()] 

u.groups = g 

您还可以改变就地名单:

g1 = Group() 
u.groups.append(g) 

关系的另一面可能会以同样的方式工作:

g.users.append(User()) 

当你改变的一面一个多对多的关系,SQLAlchemy保持对方最新 - 换句话说,如果你从Groupusers列表中删除User,那么这个列表t Group将不再出现在Usergroups列表中。

+0

好的谢谢。说实话,我实际上是通过阅读SQLAlchemy文档而不是Flask-SQLAlchemy文档(我在发布之前读过的)来理解这一点,而我正在等待某人回复。但感谢您的帮助! – GangstaGraham 2013-03-02 22:09:12

相关问题