我正在尝试构建一个页面,该页面允许管理员用户为每个用户切换特定组的成员资格。我的目标是使用 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 视图。