我有一个简单的线性工作流程,其中单个任务将有一个批准者列表,它必须通过(线性,依次)进行确认,然后才能完成。
我将其设计为将User
模型用于批准者,另外还有 2 个模型:
Task
用于管理工作流中各个任务细节的模型;和- 显式管理and
TaskStep
之间关系的模型(而不是依赖 Django 自动填充)。Tasks
Approver
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
函数?source
target
FSMIntegerField