You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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构建目标数据结构,具体步骤如下:

  1. 预取关联数据,避免N+1查询
    使用prefetch_related配合Prefetch对象,一次性查询所有Model1实例及其关联的Model2数据,仅触发2次数据库请求,大幅提升效率。

  2. 只获取需要的字段
    通过values('id', 'title')指定只查询Model2中需要的字段,减少数据传输量和内存占用。

  3. 构建目标字典
    遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:15:54