Home > Enterprise >  Filtering Base Django User by multiple groups
Filtering Base Django User by multiple groups

Time:04-27

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', '[email protected]', 'a')
user_a.groups.add(a)
user_b = User.objects.create_user('b', '[email protected]', 'b')
user_b.groups.add(b)
user_ab = User.objects.create_user('ab', '[email protected]', '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>]>

CodePudding user response:

You can implement two JOINs by using two .filter(…) clauses [Django-doc], and thus filter with:

User.objects.filter(groups=a).filter(groups=b)
  • Related