Ассоциативный прокси - это расширение 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
в прокси ассоциации, но он тоже не работал.
Возможно ли это, или мне нужно вместо этого создать гибридное свойство? Если есть хитрость, чтобы сделать эту работу, будет ли она предпочтительнее, чем гибридное свойство?