2017-02-14 6 views
0

データベースからロード/保存するためにSQLAlchemy ORMを使用しています。しかし、私は、データベースからデータをロードするに呼び出される特定の機能をしたいと思い、このような何か:SQLAlchemyカスタムロード/セーブ機能(セッターとゲッター)

class MyClass(Base): 
    id = Column(Integer, primary_key = True) 
    _data = relationship('Data') 

    def __init__(self): 
     self._data = [] 
     self.max_data = None 
     self.min_data = None 

    @property 
    def data(self): 
     return self._data 

    @data.setter 
    def data(self, data): 
     print('gone through setter') 
     self.min_data = min(data) 
     self.max_data = max(data) 
     self._data = data 

はしかし、私は、DBから/ロードを保存するときにセッターとゲッターが呼ばれていないことに気づきました。これらのセッターとゲッターを呼ぶ方法はありますか?

myclass = MyClass() 
myclass.data = [0,1,2,3,4,5] 
# gone through setter 
myclass.max_data 
# 5 
myclass.min_data 
# 0 
session.add(myclass) 
session.commit() 

del myclass 

myclass = session.query(MyClass).all()[0] 
# setter is not called here 
myclass.max_data 
# None 
myclass.min_data 
# None 

min_datamax_dataが上の行動を添付するには(明示的にDBに保存することなく)

+0

私は 'MyClass'クラスのインスタンスを作成するときに' getter'と 'setter'が動作すると確信しています。関係の '_data'ではなく、インスタンス属性(' _data')を取得して設定していることに注目してください。それで、戻ってきたいものを少し説明してください。 – metmirr

+0

私の質問の末尾にいくつかの詳細を追加しました – nven

+0

setterとgetterの使い方が不足しているので、setterの作業が表示されます: 'myclass.data = [1、2、3 4]' – metmirr

答えて

2

に設定されているように私は、同様にDBから負荷に呼び出されるセッターをしたいと思います負荷、load event使用:

:この特定の例では

@event.listens_for(MyClass, "load") 
def _set_min_max_on_load(target, context): 
    target.max_data = max(target._data) 
    target.min_data = min(target._data) 

が、それは単に代わりhybrid_property Sを使用することが有用であり得ます

class MyClass(Base): 
    ... 
    @hybrid_property 
    def max_data(self): 
     return max(self.data) 

    @max_data.expression 
    def max_data(cls): 
     return select([func.max(Data.__table__.c.some_value)]).where(Data.__table__.c.my_class_id == cls.id) 
関連する問題