Django如何按模型属性分组过滤并返回指定结构的数据
实现方案
你期望返回的是以分组值为键的字典结构(注意你示例中用[]包裹键值对是JSON语法错误,正确的键值对集合需要用{}包裹),无法直接通过单次filter过滤查询得到,但是可以通过以下两种高效的方式实现,两种方案都只需要查询1次数据库,远优于你现有按分组多次查询的写法:
方案1:直接遍历QuerySet构造字典(逻辑最简单,无额外依赖)
直接查询所有用户后遍历,按group字段归类:
result = {} # 一次查询拿到所有用户 all_users = User.objects.all() for user in all_users: group_val = user.group if group_val not in result: result[group_val] = [] # 按你需要的字段格式组装数据 result[group_val].append({ "username": user.username, "group": group_val })
方案2:用itertools.groupby分组(适合数据量中等的场景)
需要先对QuerySet按分组字段排序,再调用groupby分组:
from itertools import groupby # 必须先按group字段排序,否则groupby会出现重复分组 all_users = User.objects.all().order_by("group") result = { group_key: [{"username": u.username, "group": group_key} for u in group_users] for group_key, group_users in groupby(all_users, key=lambda x: x.group) }
两种方案最终得到的result就是你需要的结构:
{ "1": [{"username":"user1","group":"1"}], "2": [{"username":"user2","group":"2"}], "3": [{"username":"user3","group":"3"}] }
内容的提问来源于stack exchange,提问作者yellowlight
相关产品推荐
相关产品推荐

