gpt4 book ai didi

Django 过滤父级,其中所有子值都符合条件

转载 作者:行者123 更新时间:2023-12-04 14:13:51 24 4
gpt4 key购买 nike

基于这些模型:

class Job(models.Model):
status = models.CharField(max_length=30)

class Task(models.Model):
job = models.ForeignKey('Job', related_name='tasks')
status = models.CharField(max_length=30)

我需要一个查询来返回每个 Job where Job.status为空且 所有 child Task.status是“完成”。

对于上下文,当所有 Task.status是完整的,每个兄弟中的值之间的比较 Task会发生,直到所有 sibling 才执行 Task设置为“COMPLETE”,因此查询将返回那些完整的。

最佳答案

我们可以使用 Exists子查询:

from django.db.models import Exists, OuterRef, Q

Job.objects.filter(
~Exists(
Task.objects.filter(~Q(status='COMPLETE'), job_id=OuterRef('pk'))
),
status=None
)

这将导致查询如下所示:
SELECT app_name_job.*
FROM app_name_job
WHERE NOT EXISTS (
SELECT U0.id, U0.job_id, U0.status
FROM app_name_task U0
WHERE NOT U0.status = COMPLETE
AND U0.job_id = app_name_job.id
)
AND app_name_job.status IS NULL)

之前 ,您首先需要注释,然后过滤:
from django.db.models import Exists, OuterRef, Q

Job.objects.annotate(
all_complete=~Exists(
Task.objects.filter(~Q(status='COMPLETE'), job_id=OuterRef('pk'))
)
).filter(all_complete=True, status=None)

如果 Job没有任何任务,那么所有任务(好吧,没有)都被认为是完成的,所以这样 Job如果 status,s 也会列在结果中是 None .

关于Django 过滤父级,其中所有子值都符合条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62204587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com