Association Proxy是一个SQLALchemy扩展,它允许使用从关系类型推导的聚合集合将一个ORM类的属性代理到另一个ORM类。
我希望对表Item
有两个关联代理,一个关联给属性class_
,一个关联给属性object_
(在本示例中如此命名,是为了直观地说明多个对象对应一个类别)。现在,我希望在我的ORM对象中有一组名为classes
的类和一个与表objects
相对应的名为ItemsGroup
的列表。能给我吗?
from sqlalchemy.ext.associationproxy import association_proxy
class ItemsGroup(db.Model):
id = db.Column(db.Integer, primary_key=True)
items = db.relationship("Item")
# I want this proxy to be represented as a set
classes = association_proxy('items', 'class_')
# and this to be represented as a list
objects = association_proxy('items', 'object_')
class Item(db.Model):
group_id = db.Column(db.Integer, db.ForeignKey(ItemsGroup.id))
class_ = db.Column(db.Enum('Class I', 'Class 'II', 'Class III'))
object_ = db.Column(db.String(64))
现在,我知道此表架构并不理想(未规范化)。我还了解,如果我们尝试修改代理值,那么这可能无法很好地发挥作用(当修改通过ItemsGroup.classes
访问的值时,我们将不知道要修改哪个Item.class_
)。但是无论如何,我对此很感兴趣。
我可以设置关系的collection_class=set
,但是objects
不再是列表。我天真地尝试在关联代理中设置creator=set
,但也没有用。
有可能吗?还是需要创建一个混合属性?如果有技巧可以完成这项工作,那么它会比混合属性更受欢迎吗?