2016-10-26 9 views
0

属性としてカスタムクラスとの仕事をSQLAlchemyのことができますどのように、私のDBモデルの一つは、問題は、この状態の欄には、DBに保存された状態の欄は、私はSQLAlchemyのとフラスコSQLAlchemyのを使用しています

class Item(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(8)) 
    state = db.Column(db.Integer, default=ServerState.IN_PACKAGE, nullable=True) 

    def init_state(self): 

     self.state = State1 

    def transit_state(self): 

     self.state.next(self) 

が付属しています整数としてではなく、適切なステートマシンを実装するためには、クラスとして実装されています

class State1(BaseState): 

    __int = 100 
    __name = 'State1' 

    @staticmethod 
    def next(item): 
     if item.contidition1 is None or item.condition2 is None: 
      raise InvalidStateTransition 

     item.state = State2 

これがうまく機能し、コードのクリーンを保持しますが、重要な問題は、私はアイテムをコミットしたい場合ということですdbに、それは間違いなく私にエラーを与えます:

したがって、dbに保存するときにクラスを自動的にint表現に変換し、dbから取得したときにintをその状態クラスに変換する方法はありますか?

答えて

2

TypeDecoratorを使用できます。以下のような何か:

class StateType(TypeDecorator): 
    impl = Integer 

    def process_bind_param(self, value, dialect): 
     return map_integer_to_my_state(value) 

    def process_result_value(self, value, dialect): 
     return map_my_state_to_integer(value) 

次にあなたがstate列の型としてStateTypeを使用することができます。

state = db.Column(StateType, ...) 
+0

感謝!これは有望に見える – Chrim

関連する問題