[英]SQLAlchemy, appending association objects with extra fields in association proxy relationship
我在对象User
和Groups
之间有多对多关系。 我有一个名为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.