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

时间:2017-11-18 20:57:34

标签: django django-queryset django-orm

我希望在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

1 个答案:

答案 0 :(得分:0)

您的查询是正确的,但结果必须在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或者User和Group之间具有ManyToMany关系的东西,以及属性Group.name.null == False,否则还必须使用额外的非空字段(如pk)来区分空值和缺失相关对象。