Два ассоциированных прокси, использующих set и list в качестве collection_class - PullRequest
0 голосов
/ 29 мая 2019

Ассоциативный прокси - это расширение SQLALchemy, которое позволяет передавать атрибуты из одного класса ORM в другой, используя совокупную коллекцию, выведенную из типа отношения.

Я хочу иметь два прокси-сервера для сопоставления с моей таблицей Item, один для атрибута class_ и один для атрибута object_ (названный так в этом примере, чтобы дать вам интуитивное представление о том, что несколько объектов соответствуют одному классу). Теперь я хочу иметь набор классов с именем classes и список с именем objects в моем объекте ORM, соответствующий таблице 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 в прокси ассоциации, но он тоже не работал.

Возможно ли это, или мне нужно вместо этого создать гибридное свойство? Если есть хитрость, чтобы сделать эту работу, будет ли она предпочтительнее, чем гибридное свойство?

...