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')
)
假设我有两个模型:
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')
)