2017-06-25 7 views
2

2つのモデルと1対1の関係があります。 ItemDataからItemまでの列(たとえばitem = Item(); item.value)にアクセスしたいとします。私は__getattr__を上書きしようとしましたが、この方法はSQLAlachemyベースモデルで集中的に使用されています。どんな助けもありがたい。SQLAlchemy - 親モデルを介して子モデルの列にアクセスする(一対一の関係)

class Item(Model): 
    __tablename__ = "item_data" 
    id = Column(Integer, primary_key=True) 

    data = relationship("ItemData", back_populates="_item", uselist=False, 
         foreign_keys="ItemData._item_id") 

class ItemData(Model): 
    __tablename__ = "items_data" 
    id = Column(Integer, primary_key=True) 

    _item_id = Column(Integer, ForeignKey("items.id")) 
    _item = relationship("Item", back_populates="data", 
          foreign_keys=[_item_id]) 

    value = Column(Integer) 

答えて

0

Itemに適用するクラスデコレータを作成することで問題を解決しました。

from sqlalchemy.ext.hybrid import hybrid_property 

def direct_data_getter(cls): 
    '''Provide direct access to attributes of data.''' 
    fields = set(cls.data_cls.__mapper__.columns.keys()) - set(dir(cls)) 
    for field in fields: 
     method = hybrid_property(
      lambda self, field=field: getattr(self.data, field) 
     ) 
     setattr(cls, field, method) 
    return cls 
関連する問題