次のモデルが定義されています。
class Dictionary(Base):
key = Column()
value = Column()
class Attribute(Base):
id = Column()
name = Column()
class AttributeMap(Base):
objtype_id = Column()
attr_id = Column(foreign_keys='Attribute.id')
rel_attr = relationship('Attribute')
attr = association_proxy('rel_attr', 'name')
class AttributeValue(Base):
object_id = Column(foreign_keys='Object.id')
objtype_id = Column(foreign_keys='Object.objtype_id, AttributeMap.objtype_id')
attr_id = Column(foreign_keys='AttributeMap.attr_id')
uint_value = Column(foreign_keys='Dictionary.dict_key')
rel_attr = relationship('AttributeMap')
attr = association_proxy('rel_attr', 'attr')
rel_value = relationship('Dictionary')
value = association_proxy('rel_value', 'value')
class Object(Base):
id = Column()
objtype_id = Column(foreign_keys='Dictionary.dict_key')
rel_objtype = relationship('Dictionary')
objtype = association_proxy('rel_objtype', 'value')
rel_attributes = relationship('AttributeValue', collection_class=attribute_mapped_collection('attr'), uselist=True)
attributes = association_proxy('rel_attributes', 'value')
オブジェクトクラスのインスタンスを作成し、単一のトランザクション中に属性コレクションに新しい値を追加するタイミング。使用法は次のようになります。
obj = Object()
obj.rel_objtype = 'Dictionary value'
obj.attributes['Attribute name'] = 'another Dictionary value'
「Dictionary value」を「obj.rel_objtype」に割り当てると、既存の Dictionary 属性が照会されます。
obj.objtype = 'Dictionary value'
# => obj.rel_objtype = Dictionary.query().filter(Dictionary.value == 'Dictionary value').one()
「別のディクショナリ値」を「obj.attributes」に割り当てると、「attr」=「属性名」および「値」=「別のディクショナリ値」で AttributeValue の新しいインスタンスが作成されます。
av = AttributeValue()
obj.rel_attributes['Attribute name'] = av
av.attr = 'Attribute name'
# => av.rel_attr = AttributeMap.query().filter(AttributeMap.attr == 'AttributeName').one()
av.value = 'another Dictionary value'
# => av.rel_value => Dictionary.query().filter(DictionaryValue.value == 'another Dictionary value').one()
問題は、AttributeValue <-> AttributeMap 関係に「attr_id」と「objtype_id」という 2 つの外部キーがあることです。結果のエントリが重複しないように AttributeMap.query() に「objtype_id」を使用する必要がありますが、この値は親の「Object」インスタンスからのみ取得できます。
どうすればこれを実装できますか?