如何检索所有用户名以及每个用户的布尔标志,以指示其对组的成员身份



我正在尝试构建一个页面,该页面允许管理员用户为每个用户切换特定组的成员资格。我的目标是使用 AJAX 功能来做到这一点。我正在使用 Django 2.2。

我已经实现了一个 AJAX 调用,它返回系统中的所有用户 - 此数据填充一个数据表。下一步是在每个用户旁边有一个复选框,指示他们在组中的成员身份。

我在我的视图中使用以下代码来检索用户。

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

我希望用户查询结果包含每个用户的布尔字段,指示他们对特定组的成员身份。我怎样才能做到这一点?

感谢任何指导。

我们可以使用子查询 Exists [Django-doc] 来做到这一点:

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))

mygroup.pk 是要检查其成员身份的组的主键。

此查询集包含具有额外属性User的对象,如果用户属于该组,则会True该属性in_group,否则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 框架文档] [Django-doc]。根本不建议使用.values()。通过分离查询和表示形式,可以更轻松地扩展、更新等 REST 视图。

最新更新