Pytransitions:是否可以更改机器在模型中注入的模型属性?

2024-05-17 06:34:16 发布

您现在位置:Python中文网/ 问答频道 /正文

(关于pytransitions library的用法问题)。你知道吗

我正在将pytransitions状态机改装为一个现有模型,该模型碰巧已经有一个名为status的列(该模型也恰好是一个SQLAlchemy模型)。你知道吗

我注意到transitions库注入了一个state字段,但我不确定是否有办法将该字段更改为我的模型的status列,并使转换反映在该特定字段上。如果目前没有办法,我会考虑使用machine.after_state_change回调并从那里开始工作。你知道吗

除此之外(ab)使用特定的回调有什么好的解决方法?你知道吗


Tags: 模型用法absqlalchemystatuslibrarymachinechange
1条回答
网友
1楼 · 发布于 2024-05-17 06:34:16

transitions0.7.1开始,没有简单的方法可以调整模型状态属性的名称。覆盖Transition._state_changeMachine._triggerMachine.is_state太复杂了,imho。您可以使用Model.state作为属性来“别名”状态字段:

class Model:

    @property
    def state(self):
        return self.status

    @state.setter
    def state(self, value):
        self.status = value

或者使用SQLAlchemy的synonym

from sqlalchemy import Column, String, Integer, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import synonym, sessionmaker
from transitions import Machine

engine = create_engine('sqlite:///:memory:')
Session = sessionmaker(bind=engine)
Base = declarative_base()


class Model(Base):
    __tablename__ = 'Model'
    id = Column(Integer, primary_key=True, autoincrement=True)
    status = Column(String, default='initial')
    state = synonym('status')

    def __repr__(self):
        return "<Model(id='{}', status='{}')>".format(self.id, self.status)


Base.metadata.create_all(engine)
session = Session()
m1 = Model()
m2 = Model()
session.add_all([m1, m2])

m = Machine(model=[m1, m2], states=['A', 'B'], initial='A')
print(session.query(Model).filter_by(status='A').all())
# >>> [<Model(id='1', status='A')>, <Model(id='2', status='A')>]
m1.to_B()
print(session.query(Model).filter_by(status='B').all())
# >>> [<Model(id='1', status='B')>]

相关问题 更多 >