Django:如何根据不同的标准过滤相关对象?

时间:2018-02-03 14:26:56

标签: python django django-models

我正在开发一个“工作流程管理网站”,可以跟踪不同步骤的不同工作流程。工作流由具有给定顺序的多个步骤定义。 “工作”实现了工作流程,“任务”实现了这些步骤。

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)

1 个答案:

答案 0 :(得分:0)

获取分配给用户myuser的未完成任务的所有作业:

Job.objects.filter(task__finished__isnull=True, task__assigned_to=myuser)