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()])