Django - Фильтр по полю ManyToManyField

У меня есть две модели:

class Student(models.Model):
    first_name = models.CharField()
    last_name = models.CharField()


class Group(models.Model):
    name = models.CharField()
    students = models.ManyToManyField(Student)

Некоторые данные (first_name и last_name конкатенированы):

Group #1 | Blak Coleman
Group #1 | Miguel Scott
Group #2 | Jordan Barnes
Group #2 | Jordan Gustman
Group #2 | Jekson Barnes
Group #3 | Jordan Smith

Как вы можете видеть, есть три студента по имени Jordan. Поэтому мне нужно вернуть группы, которые в наборе запросов students имеют только студентов по имени Jordan.

Я попробовал следующее:

groups = Group.objects.filter(students__first_name='Jordan')

Но group.first().students.all() содержит всех студентов, а не только Джордана. Ожидаемый результат:

Group #2 | Jordan Barnes
Group #2 | Jordan Gustman
Group #3 | Jordan Smith

Как я могу это сделать?

Попробуйте это:

groups = Group.objects.filter(students__first_name__in=['Jordan'])

Это сработало:

from django.db.models import Prefetch

students = Student.objects.filter(first_name='Jordan')
prefetch = Prefetch('students', queryset=students)
groups = Group.objects.prefetch_related(prefetch)
groups = [group for group in groups if len(group.students.all())]

Для всех студентов вы можете написать запрос следующим образом...

groups = Group.objects.filter(students__id__in=[i.id for i in Students.objects.all()])
Вернуться на верх