首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pytransitions:有可能改变机器在模型中注入的模型属性吗?

Pytransitions:有可能改变机器在模型中注入的模型属性吗?
EN

Stack Overflow用户
提问于 2019-03-21 21:59:39
回答 2查看 322关注 0票数 2

我正在将pytransitions状态机改造成一个现有模型,该模型恰好已经有一个名为status的列(该模型恰好也是一个SQLAlchemy模型)。

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

除了(Ab)使用那个特定的回调之外,还有什么好的解决方法呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-06 09:34:57

从0.8.3开始,您可以在机器上指定model_attribute

代码语言:javascript
复制
>>> from transitions import Machine 
  2 class Matter(object): 
  3     pass 
  4  
  5 lump = Matter() 
  6 transitions = [ 
  7     { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid' }, 
  8     { 'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas' }, 
  9     { 'trigger': 'sublimate', 'source': 'solid', 'dest': 'gas' }, 
 10     { 'trigger': 'ionize', 'source': 'gas', 'dest': 'plasma' } 
 11 ] 
 12 machine = Machine( 
 13     model=lump,  
 14     states=['solid', 'liquid', 'gas', 'plasma'],  
 15     initial='solid',  
 16     transitions=transitions,  
 17     model_attribute='my_state' 
 18 )
                                                       
>>> lump.state                                     
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Matter' object has no attribute 'state'

'Matter' object has no attribute 'state'

>>> lump.my_state                                  
'solid'
票数 2
EN

Stack Overflow用户

发布于 2019-09-13 21:46:03

transitions 0.7.1开始,没有简单的方法来调整模型状态属性的名称。覆盖Transition._state_changeMachine._triggerMachine.is_state太复杂了,伙计。您可以通过使用Model.state作为属性来为status字段添加别名:

代码语言:javascript
复制
class Model:

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

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

或者使用SQLAlchemy的synonym

代码语言:javascript
复制
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')>]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55282139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档