如何将CSV文件最简单地导入Django模型表?
嘿,这个需求我熟得很!处理几千条问题数据导入Django的Question表,最简的方法分两种,看你偏好可视化操作还是纯脚本:
方案一:用django-import-export(零代码可视化,懒人首选)
这是我最推荐的快速导入方式,装个库就能在Django后台直接操作,不用写复杂代码:
- 先装依赖:
pip install django-import-export
- 打开项目的
settings.py,在INSTALLED_APPS里加一行:
INSTALLED_APPS = [ # 其他已有的app... 'import_export', ]
- 编辑你的app下的
admin.py,给Question模型加上导入导出功能:
from django.contrib import admin from import_export.admin import ImportExportModelAdmin from .models import Question @admin.register(Question) class QuestionAdmin(ImportExportModelAdmin): pass
- 重启Django服务,登录后台找到Question表,你会看到多了个「导入」按钮!上传你的CSV文件,跟着向导匹配字段、预览数据,确认没问题就能一键导入,几千条数据分分钟搞定,还能自动处理基本的格式校验。
方案二:手写极简脚本(无额外依赖,灵活可控)
如果你不想加第三方库,写个十几行的脚本就能搞定,放在项目根目录(和manage.py同文件夹):
import csv import os import django # 初始化Django环境 os.environ.setdefault('DJANGO_SETTINGS_MODULE', '你的项目名.settings') django.setup() # 替换成你的app和模型路径 from your_app_name.models import Question # 读取CSV文件,注意编码要和你的CSV匹配(比如Excel导出的可能是gbk) with open('questions.csv', 'r', encoding='utf-8') as f: reader = csv.DictReader(f) # 批量收集数据,比逐条保存高效N倍 question_list = [] for row in reader: # 这里要保证CSV的字段名和Model字段对应,比如CSV的"title"对应Question.title # 有特殊字段(比如日期、外键)的话,在这里做格式转换 question = Question( title=row['title'], content=row['content'], # 其他字段按你的Model定义补充 ) question_list.append(question) # 批量插入数据库 Question.objects.bulk_create(question_list)
运行脚本的命令:
python import_questions.py
一些必看的小提示
- 导入前一定要备份数据库,或者先在测试环境跑一遍,避免数据混乱
- 如果CSV里有重复数据,要么先在CSV里手动去重,要么在脚本里加判断(比如用
get_or_create,但批量插入就没法用了,得逐条处理) - 编码坑:Excel导出的CSV经常是
gbk或者utf-8-sig编码,打开文件时要对应设置encoding='gbk'或者encoding='utf-8-sig' - 外键字段:如果Question有外键,CSV里要存外键对应的主键值,或者在脚本里根据名称查询关联对象再赋值
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

