sqlalchemy如何使用自定义类作为属性

时间:2016-10-26 08:38:13

标签: python sqlalchemy flask-sqlalchemy

我正在使用sqlalchemy和flask-sqlalchemy,我的一个db模型带有一个状态列

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) 

问题是这个状态列是作为整数保存到db中的,但是为了实现一个正确的状态机,它被实现为一个类:

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

这很好用并保持代码干净,但关键问题是当我想将Item提交到db时,肯定会给我错误:

 Incorrect integer value: '<class 'app.models.Item.State1'>' for column 'state' at row 1

那么,会话或python是否有一种方法可以在保存到db时自动将类转换为其int表示形式,并在从db中检索时从int转换为其状态类?

1 个答案:

答案 0 :(得分: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)

然后,您可以使用StateType作为state列的类型:

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