Модель фильтра Django ORM, в которой все отношения имеют значение, равное
Допустим, у меня есть две модели:
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'))
Но это не сработало, он не удаляет тех, у кого есть только одна задача, как эта.
Я мог бы перебрать все рабочие и задачи, чтобы найти его, но есть ли способ сделать этот запрос, используя только orm?
Обозначьте набор запросов количеством совпадающих задач и общим количеством, затем отфильтруйте те, где общее количество больше единицы и количество совпадений равно общему количеству
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')
)