3

我有一个简单的线性工作流程,其中单个任务将有一个批准者列表,它必须通过(线性,依次)进行确认,然后才能完成。

我将其设计为将User模型用于批准者,另外还有 2 个模型:

  • Task用于管理工作流中各个任务细节的模型;和
  • 显式管理andTaskStep之间关系的模型(而不是依赖 Django 自动填充)。TasksApprover
    class Task(models.Model):
        title =  models.CharField(max_length=30)
        approvers = models.ManyToManyField(
            get_user_model(),
            related_name='approvers_taskstep_set',
            through='TaskStep'
        )

    class TaskStep(models.Model):
        approver = models.ForeignKey(
            get_user_model(), null=True, on_delete=models.SET_NULL
        )
        task = models.ForeignKey(Task, null=True, on_delete=models.SET_NULL)

我想使用django-fsm创建一个有限状态机来跟踪工作流中每个任务的状态。

我知道如果我预先定义每个工作流程中的批准者数量,我可以轻松做到这一点。例如,如果它是 3,我可以简单地将它放在一个整数字段中,然后创建每个批准者会调用的关联函数:

// in Task(models.Model):
STATUS_APPROVER_1 = 0
STATUS_APPROVER_2 = 1
STATUS_APPROVER_3 = 2
STATUS_CHOICES = (
    (STATUS_APPROVER_1 , 'With approver 1'),
    (STATUS_APPROVER_2 , 'With approver 2'),
    (STATUS_APPROVER_3 , 'With approver 3'),
)

status = FSMIntegerField(
    choices=STATUS_CHOICES, default=STATUS_APPROVER_1, protected=True
)
...
@transition(field=status, source='STATUS_APPROVER_1', target=STATUS_APPROVER_2)
def advance_approver_1(self):
...

但是,假设我希望允许用户自己定义批准者的数量(以及因此的步骤数)。我该怎么办?我会一直保持这种线性发展,而不是平行发展。

有没有办法用 django-fsm 做到这一点,还是我看错了?我想也许试图STATUS_CHOICES通过循环的数量/长度来动态创建代理,approvers但我不知道如何开始。

也许是and中的一个lamba函数?sourcetargetFSMIntegerField

4

0 回答 0