将集合和列表用作集合类的两个关联代理

2024-10-01 19:33:23 发布

您现在位置:Python中文网/ 问答频道 /正文

Association Proxy是一个SQLALchemy扩展,它支持使用从关系类型派生的聚合集合将属性从一个ORM类代理到另一个ORM类

我希望我的表Item有两个关联代理,一个用于属性class_,另一个用于属性object_(在本例中命名这样的代理是为了让您直观地看到多个对象对应于一个类)。现在,我希望在对应于表ItemsGroup的ORM对象中有一组名为classes的类和一个名为objects的列表。能给我这个吗

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,但也不起作用

这是可能的还是我需要创建一个混合属性?如果有一个诀窍使这项工作,它会是首选的混合财产


Tags: id代理db属性objectsobjectormitems

热门问题