Django фильтрует объект по ManyToMany и возвращает только те отношения ManyToMany, которые соответствуют друг другу
class Category(models.Model):
....
class User(models.Model):
.....
category = models.ForeignKey(
Category, on_delete=models.SET_NULL, null=True)
group = models.ManyToManyField(
Group, through="UserGroup")
class Group(models.Model:
....
class UserGroup(models.Model):
......
user = models.ForeignKey(
User, on_delete=models.CASCADE)
Group = models.ForeignKey(
Group, on_delete=models.CASCADE)
.....
Я хочу иметь возможность возвращать группы, которые содержат пользователя с определенной категорией. что я могу сделать с помощью...
queryset = Group.objects.all()
category = Category.objects.get(pk=category_id)
queryset = queryset.filter(user__category_id=category_id)
Но это все равно возвращает всех пользователей, связанных с этой группой, даже если User.category не равен заданному category_id. Как мне исключить тех пользователей, которые не связаны с группой, чтобы возвращались только пользователи с правильной категорией?
Итак, если есть user1 & user2, которые оба имеют category_id 1, а user3 имеет category_id 2, то группа возвращается только с данными user1 & user2 из сериализатора?
Ах, использование prefetch_related & Prefetch() отлично справится с этим....
queryset = Group.objects.all()
users = User.objects.filter(category_id=category_id)
queryset.filter(user__category_id=category_id).prefetch_related(Prefetch('user_set', queryset=users))