In my Django project I’m using base Django User and Group models. My goal is to get User queryset containing all User object who are assigned to multiple groups at the same time.
For example I two groups and three users:
from django.contrib.auth.models import User, Group
a = Group.objects.create(name='a')
b = Group.objects.create(name='b')
user_a = User.objects.create_user('a', 'a@a.com', 'a')
user_a.groups.add(a)
user_b = User.objects.create_user('b', 'b@b.com', 'b')
user_b.groups.add(b)
user_ab = User.objects.create_user('ab', 'ab@ab.com', 'ab')
user_ab.groups.add(a)
user_ab.groups.add(b)
I have tried filtering using __in on groups nad Q, but with no effect
from django.db.models import Q
User.objects.filter(groups__in=[a,b]).distinct()
<QuerySet [<User: a>, <User: ab>, <User: b>]>
User.objects.filter(Q(groups=a) & Q(groups=b))
<QuerySet []>
My expected result would be:
User.objects.filter(???)
<QuerySet [<User: ab>]>
>Solution :
You can implement two JOINs by using two .filter(…) clauses [Django-doc], and thus filter with:
User.objects.filter(groups=a).filter(groups=b)