2016-03-07 45 views
0

我在对象UserGroups之间拥有多对多的关系。我有一个名为Attends的关联对象,其中包含额外的字段role。我想通过使用关联代理来减少关联对象关系的冗长性。不幸的是,当我将一个新用户附加到一个组时,文档不清楚如何明确地添加额外字段roleSQLAlchemy,在关联代理关系中添加具有额外字段的关联对象

Group类

class Group(db.Model): 
    __tablename__ = 'group' 

    gid = db.Column(db.Integer, primary_key=True, autoincrement=True) 
    oid = db.Column(db.Integer, db.ForeignKey('organization.oid'), nullable=False) 
    start_time= db.Column(db.DateTime, nullable=False) 
    end_time = db.Column(db.DateTime, db.CheckConstraint('end_time > start_time'), nullable=False) 
    location = db.Column(db.String, nullable=False) 
    description = db.Column(db.Text) 

    organization = db.relationship('Organization', back_populates='groups') 

    #many-to-many db.relationship with users 
    registered_users = association_proxy('user_groups', 'user') 

    #one to many db.relationship with tags 
    tags = db.relationship('Tag', back_populates='group') 

    def add_user(self, user, role): 
     if not self.has_user(user): 
      self.registered_users.append(Attend(user, self, role)) <-- error 
     else: 
      raise ValueError('user %s already exists', user) 

上课

class Attend(db.Model): 
    __tablename__ = 'attend' 
    uid = db.Column(db.Integer, db.ForeignKey('user.uid'), primary_key=True) 
    gid = db.Column(db.Integer, db.ForeignKey('group.gid'), primary_key=True) 
    user_role = db.Column(db.Enum(*GroupRoles.roles, name='role')) 

    group = db.relationship('Group', 
     backref=db.backref('user_groups', cascade='all, delete-orphan')) 

    user = db.relationship('User') 

    def __init__(self, user, group, role): 
     self.user = user 
     self.group = group 
     self.user_role = role 

执行add_user方法时,收到以下错误:

 def _create(self, value): 
>  return self.creator(value) 
E  TypeError: __init__() missing 2 required positional arguments: 'group' and 'role' 

回答

1

user_groupsAttend对象AA列表(即一个与的关系)和registered_users应该是User对象的列表。当你追加到registered_users,你需要让association_proxy知道如何构建相应的Attend对象user_groupsdocs):

registered_users = association_proxy('user_groups', 'user', 
            creator=lambda u: Attend(user=u, user_role='some_default_role')) 

注:SQLAlchemy的不知道是什么role是,那么你需要提供默认值。它确实知道什么组应该是,凭借user_groups关系在Group。如果你希望能够做add_user(user, role),你可以简单地自己直接追加到关系:

def add_user(self, user, role): 
    if not self.has_user(user): 
     self.user_groups.append(Attend(user=user, user_role=role)) 
    else: 
     raise ValueError('user %s already exists', user) 

请注意,这是假定你改变你的Attend类使用默认构造函数。