我正在开发一个“工作流程管理网站”,可以跟踪不同步骤的不同工作流程。工作流由具有给定顺序的多个步骤定义。 “工作”实现了工作流程,“任务”实现了这些步骤。
class Workflow(models.Model):
name = models.CharField(_('Name'),max_length = 100, unique = True)
class Step(models.Model):
workflow = models.ForeignKey(
Workflow,
on_delete=models.CASCADE,
)
name = models.CharField(_('Name'), max_length = 100)
order = models.SmallIntegerField(_('Reihenfolge'))
class Job(models.Model):
workflow = models.ForeignKey(
Workflow,
on_delete=models.CASCADE,
)
def current_task(self):
# first task without finished date
my_tasks = self.task_set\
.filter(finished__isnull=True)\
.order_by('step__order')
if my_tasks.exists():
return my_tasks.first()
return False
class Task(models.Model):
job = models.ForeignKey(
Job,
on_delete=models.CASCADE,
)
step = models.ForeignKey(
'Step',
on_delete=models.CASCADE,
)
assigned_to = models.ForeignKey(
User,
on_delete=models.CASCADE,
)
工作流的当前任务是没有“完成”日期的“第一个”任务(由task.step.order给出排序)。如果没有这样的任务,那么工作就完成了。
我的问题是如何过滤许多工作的当前任务。例如,我想过滤当前任务被分配给某个用户的作业。到目前为止,我使用for循环并为每个作业检查job.current_task().assigned_to
,但这显然是一种非常缓慢/愚蠢的方式。有更有效的方法吗?
当然,我可以添加一个从Job指向当前任务的额外关系(不是DRY),但这不是必需的吗?
编辑:这是我目前用于过滤作业的方法(由'queryset'给出),其中当前任务被分配给'myuser':
for job in queryset:
if not job.current_task() or not job.current_task().assigned_to == myuser:
exclude.append(job.id)
queryset_filtered = queryset.exclude(id__in=exclude)
答案 0 :(得分:0)
获取分配给用户myuser
的未完成任务的所有作业:
Job.objects.filter(task__finished__isnull=True, task__assigned_to=myuser)