Модель фильтра 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')
)
Вернуться на верх