我希望在User.objects.values('id', 'username', '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
答案 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
)来区分空值和缺失相关对象。