繁体   English   中英

SQLAlchemy,在关联代理关系中为关联对象附加额外的字段

[英]SQLAlchemy, appending association objects with extra fields in association proxy relationship

我在对象UserGroups之间有多对多关系。 我有一个名为Attends的关联对象,其中包含额外的字段role 我想通过使用关联代理来减少关联对象关系的详细程度。 不幸的是,关于将新用户追加到组中时如何显式添加额外字段role的文档还不清楚。

团体课

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'

user_groups应的氨基酸列表Attend对象(即,关系到Attend ),和registered_users应的列表User对象。 当你追加到registered_users ,你需要让association_proxy知道如何构建相应的Attend的对象user_groups文档 ):

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类更改为使用默认构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM