Django中如何将模型查询结果各字段值分别提取存入对应独立列表
Django 3.x QuerySet 转字段聚合字典最优方案
方案1:ORM查询阶段直接生成(性能最优,优先推荐)
直接通过values_list取指定字段的值序列,利用Python解压+打包特性一步生成目标格式,无需额外遍历字典结构:
# 定义你需要提取的字段列表 fields = ["id", "author", "price", "category", "available"] # 查询并直接转换:*解压所有行的元组,zip按列合并,最终和字段名配对生成字典 result = dict(zip(fields, map(list, zip(*Book.objects.values_list(*fields)))))
该方案优势:
- 仅执行1次数据库查询,无多余的中间字典生成步骤
- 时间复杂度为O(n),是所有方案中性能最高的实现,适合数据量较大的场景
- 可灵活指定需要的字段,避免查询不需要的字段浪费内存和IO
方案2:已有values()查询结果时的转换方案
如果你已经获取到book_details = Book.objects.all().values()的结果,可以用Python标准库defaultdict实现转换:
from collections import defaultdict result = defaultdict(list) # 遍历一次QuerySet即可完成所有字段的聚合 for row in book_details: for key, value in row.items(): result[key].append(value) # 若需要转为普通字典,执行以下代码即可 result = dict(result)
该方案优势:
- 适配已拿到values()结果的场景,代码可读性高
- 仅遍历一次QuerySet,时间复杂度同样为O(n),性能优秀
- 无需提前指定字段名,会自动聚合所有返回的字段
补充说明:如果查询结果可能为空,建议先判断
book_details是否为空再执行转换,避免取字段时报错。
内容的提问来源于stack exchange,提问作者kumar
相关产品推荐
相关产品推荐

