Django 查询对象以及所有满足条件的相关对象

Kor*_*ijn 5 django orm model

鉴于这些 Django 模型:

class Job(models.Model):
    pass

class Task(models.Model):
    job = models.ForeignKey('Job', related_name='tasks')
    status = models.CharField(choices=TaskStatus.CHOICES, max_length=30)
    dependencies = models.ManyToManyField("self", related_name="dependents", symmetrical=False)
Run Code Online (Sandbox Code Playgroud)

我想查询单个作业的所有状态为“待处理”的任务以及状态为“已完成”的所有依赖项。

我编写了以下查询,但它返回至少具有一个依赖项且状态已完成的任务,这显然不是我想要的。

tasks_that_can_be_executed = Task.objects.filter(
    job__pk=job_id,
    status=TaskStatus.PENDING,
    dependencies__status=TaskStatus.COMPLETED
)
Run Code Online (Sandbox Code Playgroud)

有什么建议么?

avd*_*avd 7

from django.db.models import IntegerField, Case, When, Count, Q

Task.objects.filter(
    job=job,
    status=TaskStatus.PENDING,
).annotate(
    not_completed_dependencies_count=Count(
        Case(When(~Q(dependencies__status=TaskStatus.COMPLETED), then=1),
             output_field=IntegerField(),
        )
    )
).filter(
    not_completed_dependencies_count__gt=0
)
Run Code Online (Sandbox Code Playgroud)