使用set和list作为collection_class的两个关联代理

时间:2019-05-29 09:18:52

标签: python sqlalchemy flask-sqlalchemy

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,但也没有用。

有可能吗?还是需要创建一个混合属性?如果有技巧可以完成这项工作,那么它会比混合属性更受欢迎吗?

0 个答案:

没有答案