Django ORM 过滤器模型,其中所有关系的值都等于

Django ORM filter model where all relation have value equals to

假设我有两个模型:

class Worker(models.Model):
    name = models.CharField(max_length=100)
    
    
class Task(models.Model):
    worker = models.ForeignKey(Worker)
    name = models.CharField(max_length=100)

我想检索所有任务都称为“挖掘”的所有工作人员。但是我不想要只有一个名为“挖掘”的任务的工人。

我试过使用过滤器并用 Q 排除,如下所示:

Worker.objects.filter(task__name='dig').exclude(~Q(task__name='dig'))

但它没有用,它不会删除那些只有一项任务的任务。

我可以遍历 worker 和 tasks 来找到它,但是有什么方法可以只使用 orm 来进行这个查询吗?

用匹配任务的计数和总计数来注释您的查询集,然后在总数大于 1 且匹配的数量等于总数的地方进行过滤

from django.db.models import Count, F, Q
Worker.objects.annotate(
    num_tasks=Count('task'),
    num_digs=Count('task', filter=Q(task__name='dig'))
).filter(
    num_tasks__gt=1,
    num_tasks=F('num_digs')
)