我有一个模型,我想通过对象本身的属性返回组。假设模型是下一个:
class User():
username = models.CharField(max_length=50, unique=True)
group = models.CharField(max_length=20)
稍后在视图中,我将按组获取所有用户:
group1 = User.objects.filter(group='1')
group2 = User.objects.filter(group='2')
group3 = User.objects.filter(group='3')
,但为每个组将返回下一个结构:
[{"username":"user1", "group":"1"}]
[{"username":"user2", "group":"2"}]
[{"username":"user3", "group":"3"}]
我如何直接从过滤器中获得下一个结构(其中组是根),或者我如何组合组来实现这一点:
[
"1": [{"username":"user1","group":"1"}],
"2": [{"username":"user2","group":"2"}],
"3": [{"username":"user3","group":"3"}]
]
我假设您没有Group模型,只有User模型中的一个字段。我不是Django专业人员,所以我不知道任何Django技巧可以帮助你实现你的目标——尽管我确定Django ORM有一些函数可以为你执行GROUP BY查询。但是,为什么不编写一个完全python化的解决方案,简单地将已有的集合转换为您想要的集合呢?
在注释之后更新
试试下面的脚本:
from functools import reduce
users = [
{'username': 'foo', 'group':'1'},
{'username': 'bar', 'group':'2'},
{'username': 'baz', 'group':'1'},
{'username': 'asd', 'group':'2'},
{'username': 'zxc', 'group':'3'},
{'username': 'rty', 'group':'1'},
{'username': 'fgh', 'group':'2'},
{'username': 'vbn', 'group':'3'},
]
def reducer(acc,el):
group = el['group']
if not acc.get(group):
acc[group]=[el.get('username')]
else:
acc[group].append(el['username'])
return acc
print(reduce(reducer, users, {}))
它将打印结果,看起来很接近你想要的:
{'1': ['foo', 'baz', 'rty'],
'3': ['zxc', 'vbn', 'vbn'],
'2': ['bar', 'asd', 'fgh']}