Как получить все имена пользователей вместе с логическим флагом для каждого пользователя, чтобы указать его членство в группе? - PullRequest
2 голосов
/ 23 апреля 2019

Я пытаюсь создать страницу, которая позволяет пользователю с правами администратора переключать членство в определенной группе для каждого пользователя. Я стремлюсь сделать это с функциональностью AJAX. Я использую Django 2.2.

Я реализовал вызов AJAX, который возвращает всех пользователей в системе - эти данные заполняют таблицу данных . Следующим шагом будет установка флажка рядом с каждым пользователем, указывающая его членство в группе.

Я использую приведенный ниже код для поиска пользователей.

users = list(GeminiUser.objects.filter(is_active=1).values('email'))

Я хочу, чтобы результат запроса пользователей содержал логическое поле для каждого пользователя, указывающее его принадлежность к определенной группе. Как мне этого добиться?

Цените любые указания.

1 Ответ

4 голосов
/ 23 апреля 2019

Мы можем сделать это с помощью подзапроса и 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.

...