0

下面是我的代码a.py:

from django.db import models
from django_fsm import transition, FSMIntegerField
from django_fsm import FSMField, transition
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
import django
django.setup()

from django.core.management import call_command
class Order(models.Model):
     STATUS_STARTED = 0
     STATUS_SLOW =1
     STATUS_FAST=2
     STATUS_JUMP=3
     STATUS_CHOICES = (
      (STATUS_STARTED, 'STARTED'),
      (STATUS_SLOW,'SLOW')
      (STATUS_FAST,'FAST')
      (STATUS_JUMP,'JUMP')
       )
product = models.CharField(max_length=200)
status = FSMIntegerField(choices=STATUS_CHOICES, default=STATUS_STARTED, protected=True)

一个人从一个点开始,他要么快要么慢。

@transition(field=status, source=[STATUS_STARTED],  target=STATUS_FAST)
def fast(self):
    print("person run fast")

@transition(field=status, source=[STATUS_STARTED],  target=STATUS_SLOW)
def slow(self):
    print("person run slow ")

处于 FAST 状态的人可以切换到 SLOW 状态并可以 JUMP:

@transition(field=status, source=[STATUS_FAST],  target=STATUS_SLOW)
def switch(self)
    print("state switched")

@transition(field=status, source=[STATUS_FAST, STATUS_SLOW],  target=STATUS_JUMP)
def jump(self)
    print("person jumpped")

但我有条件从慢速状态开始的人不能跳跃。

从 FAST 状态,他可以 SLOW & JUMP,但不能直接从 STARTED--> SLOW--> JUMP 是可能的。

但是当我运行上面的代码时:

     >>person = Order() #input
     >>person.slow() # Input
     >> person run slow # output
     >>person.jump() # Input
     >>person jumpped # output but expected transition error. 

我发现这是因为,FSM 将单独保持最后一个状态,并且按照 jump(),从 SLOW 到 JUMP 被执行..

任何在@transition 函数之后为 FAST 状态定义变量(让 SAY 'X')并设置为 X=Y 的可能性,以表明人已达到此状态。这样当他进入 JUMP 状态时,可以验证变量是否 X==Y ?如果是这样,如何定义它。

4

1 回答 1

1

有限状态机没有旧状态的回忆(下推自动机使用堆栈代替,并且可以拥有那种内存)

您仍然可以使用 FSM 解决相同的问题,但需要更多状态:

例如,您必须有一个州:

  • 对于一个开始快速并减速到 STARTED_FAST_SLOWED_DOWN 的
  • 对面一个去 STARTED_SLOW_FASTER_NOW

然后,如果可能,您可以进行从以下状态移动的操作

于 2020-09-03T21:52:03.003 回答