Мы можем сделать это с помощью подзапроса и Exists
[Django-doc] :
from django.db.models import Exists, OuterRef
in_group = Group.objects.filter(
pk=<i>mygroup.pk</i>,
user=OuterRef('pk')
)
my_users = User.objects.annotate(in_group=Exists(in_group))
с mygroup.pk
первичным ключом группы, для которой вы хотите проверить членство.
Этот набор запросов содержит User
объектов с дополнительным атрибутом in_group
, то есть True
, если пользователь принадлежит группе, и False
в противном случае.
Например:
>>> from django.contrib.auth.models import Group, User
>>> mygroup = Group.objects.first()
>>> from django.db.models import Exists, OuterRef
>>>
>>> in_group = Group.objects.filter(
... pk=mygroup.pk,
... user=OuterRef('pk')
... )
>>>
>>> my_users = User.objects.annotate(in_group=Exists(in_group))
>>> my_users
<QuerySet [<User: >, <User: test>]>
>>> [u.in_group for u in my_users]
[True, False]
Вы также можете выполнить дополнительную фильтрацию для набора запросов, например, он показывает только активных пользователей и т. Д.
Что касается сериализации, используйте сериализатор [Django REST framework doc] [Django-doc] . Использование .values()
не рекомендуется вообще. Разделив запрос и представление, вы упростите расширение, обновление и т. Д. Представления REST.