如何在Django中高效合并加载数据以生成指定格式结果?
Django高效生成指定格式数据的实现方案
你的模型定义(已修正拼写错误,否则无法正常运行)
from django.db import models class Model1(models.Model): name = models.CharField(max_length=100) # 修正:CharField首字母大写,补充必填的max_length参数 class Model2(models.Model): model1 = models.ForeignKey(Model1, on_delete=models.CASCADE) # 修正:ForeignKey拼写,补充必填的on_delete参数 id = models.IntegerField(primary_key=True) title = models.CharField(max_length=200) # 修正:CharField拼写,补充max_length参数
期望输出格式
{ "model_name1": [{"id":1,"title":"title1"},{"id":2,"title":"title2"}], "model_name2": [{"id":3,"title":"title1"},{"id":4,"title":"title2"}] }
高效实现方案
核心思路是优化数据库查询+直接通过ORM构建目标数据结构,具体步骤如下:
预取关联数据,避免N+1查询
使用prefetch_related配合Prefetch对象,一次性查询所有Model1实例及其关联的Model2数据,仅触发2次数据库请求,大幅提升效率。只获取需要的字段
通过values('id', 'title')指定只查询Model2中需要的字段,减少数据传输量和内存占用。构建目标字典
遍历Model1实例,以实例的name为键,对应的Model2数据列表为值,直接生成目标结构。
完整代码示例
from django.db.models import Prefetch import json # 预取关联数据,指定只查询需要的字段 model1_list = Model1.objects.prefetch_related( Prefetch( 'model2_set', queryset=Model2.objects.values('id', 'title'), to_attr='related_model2s' # 自定义属性名,避免覆盖默认的model2_set ) ).all() # 构建结果字典 result = {} for model1 in model1_list: result[model1.name] = list(model1.related_model2s) # 转为JSON格式(如果需要) json_result = json.dumps(result, indent=2) print(json_result)
方案优势
- 查询效率高:仅2次数据库查询,彻底解决N+1问题
- 内存占用低:只加载需要的字段,避免冗余数据
- 代码简洁:直接利用Django ORM的关联关系,无需手动拼接数据
内容的提问来源于stack exchange,提问作者abin_alpha
相关产品推荐
相关产品推荐

