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))
Вернуться на верх