如何在 Django 用户模型查询中的一行中获取 groups__name?

How do I get groups__name on a line in the Django user model query?

我想在 User.objects.values('id', 'username', 'groups__name')

的一行中得到 groups__name

但我得到了例子:

{'groups__name': None, 'id': 1, 'username': 'admin'},
{'groups__name': 'Manager', 'id': 2, 'username': 'test'},
{'groups__name': 'Personal', 'id': 2, 'username': 'test'}

我想要这样的查询:

{'id': 1, 'groups__name': None, 'username': 'admin'},
{'id': 2, 'groups__name': ('Manager', 'Personal'), 'username': 'test'}

我使用的是 django 1.11

您的查询是正确的,但结果也必须在 Python 之后进行操作,以将所有相关名称作为元组排在一行中。函数 itretools.groupby 期望可迭代参数由 key 函数排序(即,提取的用户对象项目没有与组相关的项目)。

from itertools import groupby

qs = (User.objects.values('id', 'username', 'groups__name')
      .order_by('username', 'id', 'groups__name')
      )
qs_list = []

for key, gr in groupby(qs, key=lambda x:
                       tuple((k, v) for k, v in x.items() if k != 'groups__name')):
    groups__name  = tuple(x['groups__name'] for x in gr if x['groups__name'] is not None)
    qs_list.append(dict(key + (('groups__name', groups__name or None),)))

脚注:
主键在order by中并不重要,但我添加了它,因为你没有写任何关于模型的内容。我期望 django.contrib.auth.models 或用户和组之间具有 ManyToMany 关系的东西,以及属性 Group.name.null == False,否则还必须使用额外的非空字段(如 pk)来区分空值和缺失值相关对象。