Django 批量导入 JSON 数据的高效方法
作者:吹吹风会发光
时间:2026-04-16
浏览:0
本文详解如何在Django中安全、高效地将JSON文件数据批量写入SQL数据库,重点纠正单条保存导致的数据丢失问题,并推荐使用bulk_create()实现一次性高性能插入。

本文详解如何在 Django 中安全、高效地将 JSON 文件数据批量写入 SQL 数据库,重点纠正单条保存导致的数据丢失问题,并推荐使用 bulk_create() 实现一次性高性能插入。
本文详解如何在 Django 中安全、高效地将 JSON 文件数据批量写入 SQL 数据库,重点纠正单条保存导致的数据丢失问题,并推荐使用 `bulk_create()` 实现一次性高性能插入。
在 Django Web 开发中,常需将外部 JSON 数据(如分析报告、API 响应或本地配置文件)持久化到数据库。但初学者易犯一个典型错误:在循环中逐条创建模型实例,却仅在循环外调用 .save() —— 这会导致仅有最后一个 JSON 条目被写入数据库,其余全部丢失。
以下为修正后的标准做法,核心是使用 Django 提供的 .bulk_create() 方法:
from django.shortcuts import render
import json
from .models import MyModel
import os
def display(request):
# 安全构建 JSON 文件路径(推荐使用 pathlib 替代 os.path 拼接)
json_file_path = os.path.join(
os.path.dirname(__file__), '..', '..', 'jsondata.json'
)
try:
with open(json_file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
# ✅ 正确:列表推导式批量构建模型实例(不触发数据库操作)
my_models = [
MyModel(
end_year=item.get('end_year'),
intensity=item.get('intensity'),
sector=item.get('sector'),
topic=item.get('topic'),
insight=item.get('insight'),
url=item.get('url'),
region=item.get('region'),
start_year=item.get('start_year'),
impact=item.get('impact'),
added=item.get('added'),
published=item.get('published'),
country=item.get('country'),
relevance=item.get('relevance'),
pestle=item.get('pestle'),
source=item.get('source'),
title=item.get('title'),
likelihood=item.get('likelihood'),
)
for item in data
]
# ✅ 一次性批量写入数据库(性能提升显著,尤其对千级以上数据)
MyModel.objects.bulk_create(my_models, batch_size=1000)
except FileNotFoundError:
data = []
print(f"Warning: JSON file not found at {json_file_path}")
except json.JSONDecodeError as e:
print(f"Invalid JSON format: {e}")
data = []
except Exception as e:
print(f"Unexpected error during bulk import: {e}")
data = []
return render(request, 'display.html', {'data': data})✅ 关键改进说明:
- 避免单条保存陷阱:原代码中 my_model_instance.save() 在 for 循环外执行,仅保存最后一次迭代对象;新方案通过列表收集全部实例后统一提交。
- 性能飞跃:.bulk_create() 将 N 条 INSERT 合并为 1–2 条 SQL 语句(取决于 batch_size),相比 N 次 .save() 可提速 10–100 倍。
- 健壮性增强:添加 item.get(key) 防止 KeyError;显式指定 encoding='utf-8' 避免中文乱码;补充多层异常捕获。
- 生产建议:
- 对超大 JSON(>10MB),改用流式解析(如 ijson)或分批处理;
- 在视图中执行大批量导入可能阻塞请求,建议迁移至管理命令(python manage.py load_json)或 Celery 异步任务;
- 若模型含 auto_now_add/auto_now 字段,需显式传入 created_at=timezone.now() 等值(bulk_create 不自动触发这些逻辑)。
掌握此模式,即可在 Django 项目中可靠、高效地完成结构化数据迁移任务。
作者最新文章
iphone蓝牙连接ipad有什么用及连接方法教程
2026-09-21 17:28
PDF怎么取消密码保护?4种解锁方法整理
2026-09-08 18:23
三星 Galaxy Z Fold8 内屏边角支撑偏软?实测与官方回应
2026-09-08 16:39
手机Excel表格制作教程:小屏幕高效录入与格式调整指南
2026-09-04 09:27
PDF文档按页转换成图片怎么做?在线转换步骤整理
2026-09-03 11:06
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































