Django数据导入导出神器django-import-export使用
前言
Django以快速开发闻名,但是如果处理数据的导出导入还需要自己写脚本,那就有违“Python之禅”了……
而且导数据通常需要不同的格式,Excel、csv、json等,每种格式的数据就要写一个脚本太麻烦了,这时直接祭出django-import-export这个神器,官方一句话介绍:django-import-export is a Django application and library for importing and exporting data with included admin integration.
特点:
- support multiple formats (Excel, CSV, JSON, ... and everything else that tablib support)
- admin integration for importing
- preview import changes
- admin integration for exporting
- export data respecting admin filters
反正好用就完事了,下面我开始上使用介绍
首先安装
pip install django-import-export
然后得添加到INSTALLED_APPS 里面
# settings.py
INSTALLED_APPS = (
...
'import_export',
)
编写Resource
不得不说,这很Django
Resource的写法与Model、Form类似,就是定义你要导入或者导出的数据格式。
这里借用一下官方的例子,首先上Model代码
class Author(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Book(models.Model):
name = models.CharField('Book name', max_length=100)
author = models.ForeignKey(Author, blank=True, null=True)
author_email = models.EmailField('Author email', max_length=75, blank=True)
imported = models.BooleanField(default=False)
published = models.DateField('Published', blank=True, null=True)
price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
categories = models.ManyToManyField(Category, blank=True)
def __str__(self):
return self.name
现在要导入数据到Book表,开始编写我们的Resource,我是在app所在目录下创建一个resource.py来放Resource定义代码
from import_export import resources
from core.models import Book
class BookResource(resources.ModelResource):
class Meta:
model = Book
这样一个最简单的Resource就定义好了,可以使用代码进行数据导出,但现在我不想用,因为我要把导出功能放在DjangoAdmin后台里面
配置Admin
修改admin.py,修改的地方就是把我们定义的Admin类原本继承的admin.ModelAdmin改成ImportExportModelAdmin,代码如下
from .models import Book
from import_export.admin import ImportExportModelAdmin
class BookAdmin(ImportExportModelAdmin):
resource_class = BookResource
admin.site.register(Book, BookAdmin)
这样就可以在后台看到有导出和导入的按钮了。

只想导出不想有导入功能咋办,改成这样:
from .models import Book
from django.contrib import admin
from import_export.admin import ExportMixin
class BookAdmin(ExportMixin, admin.ModelAdmin):
resource_class = BookResource
admin.site.register(Book, BookAdmin)
只导入不导出也行,把ExportMixin换成ImportMixin就行。
当然这些只是最简单的用法,实际需求是比较复杂的,接下来我列举几个我用到的。
调整字段顺序
要导入的数据(Excel、csv这些),可能字段顺序和Model定义的字段顺序不一样,这时就得在Resource里手动调整一下
由于我自己写的代码涉及到公司业务,所以继续借用官网的代码例子:
class BookResource(resources.ModelResource):
class Meta:
model = Book
fields = ('id', 'name', 'author', 'price',)
export_order = ('id', 'price', 'author', 'name')
其中export_order 是导出的字段顺序,fields是指定哪些字段需要导入,导入的时候是根据数据文件的列名来导入的,所以Excel、csv或者json文件里面字段名就要和fields里的或者是Model里的字段名一样,才可以进行导入。
排除字段
顾名思义,就拿那个Book的模型来说,Model定义里没有指定主键,那Django会安排一个默认的主键字段id,但是我们导入数据的Excel里应该是没有这个id的,这样就没法导入,于是我们得把这个id字段排除了,很简单,在Meta里这行代码
exclude = ['id']
设置主键字段
也是顾名思义,假如我们数据库本来就有很多书了,现在需要通过导入一个Excel来更新这批书的数据,那我就得把找一个字段来设置成主键字段,不然导入就变成新增了,跟前面提到的一样,一般Excel里不会有数据库主键id的,所以这里我选择了书名(假设我们这是一个小书店,书名都不重复的)
代码:
import_id_fields = ['name']
自定义列名
按照前文配置导出来的Excel,列名全是字段名,也就是英文的,但我想中文列名啊,也可以,就是需要花一点代码(这里就不再借用官网代码了,我自己手打)
from import_export.fields import Field
class BookResource(resources.ModelResource):
id = Field(attribute='id', column_name='编号')
name = Field(attribute='name', column_name='书籍名称')
class Meta:
model = Book
export_order = ('id', 'name', 'author', 'price',)
这样就实现了,so easy。其中Field里的attribute是指这个字段对应Model里的属性也就是字段名,column_name顾名思义就是列名。
然后可能有同学要问,Model里已经给每个字段都设置了verbose_name了,这里还要在column_name里再写一遍是不是重复了?
别急,也很简单,既然有verbose_name,那直接拿来用就完事啦~
name = Field(attribute='name', column_name=Book.name.field.verbose_name)
这就完事美滋滋啦~
加入自定义的列
最后一个,如果想在导出的数据中加入Model里不存在的字段,行不?
那肯定行啊,也很简单,直接代码:
from import_export.fields import Field
class BookResource(resources.ModelResource):
id = Field(attribute='id', column_name='编号')
name = Field(attribute='name', column_name='书籍名称')
new_field = Field(column_name='一个新的字段')
class Meta:
model = Book
export_order = ('id', 'name', 'author', 'price', 'new_field')
@staticmethod
def dehydrate_new_field(instance: Book):
return '新字段内容'
可以看到就是先在export_order 里添加这个字段,然后再加这行new_field = Field(column_name='一个新的字段'),然后下面加一个类方法来实现生成这个字段的值,这个方法是以dehydrate_字段名这样的格式来命名的,具体可以根据实际来写。
总结
django-import-export 这个插件还有很多其他的功能,不过现阶段已经满足了我的工作需要,所以我也没有再去深入,还有什么功能需要可以直接翻文档吧。
目前我用到的还是以导出为主,导入的就是更新和新增这一块,没多少花样,如果接下来遇到其他新的需求,我会再更新一篇文章来介绍更新这个插件的功能~
参考资料
- 项目主页:https://github.com/django-import-export/django-import-export
- 官方文档:https://django-import-export.readthedocs.io/en/latest/installation.html
欢迎交流
程序设计实验室专注于互联网热门新技术探索与团队敏捷开发实践,在公众号「程序设计实验室」后台回复 linux、flutter、c#、netcore、android、kotlin、java、python 等可获取相关技术文章和资料,同时有任何问题都可以在公众号后台留言~
Django数据导入导出神器django-import-export使用的更多相关文章
- java中通过jacob调用dts进行数据导入导出
在一个项目中需要金蝶软件对接,但是业务服务器和财务服务器相隔很远(中间经过好几台服务器,有内网也有外网),从一个内网向另一个内网中传输时,需要外网辅助,因为不让原始数据受污染,使用了DTS数据同步到另 ...
- 2.11 Hive中数据导入导出Import和Export使用
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ImportExport 一.Export.Import Export ...
- 【DB2】文件导入导出常见命令总结 EXPORT IMPORT LOAD
参考文献地址:https://blog.csdn.net/reaper1022/article/details/18601973 Db2 的数据迁移,最常用的就是导入导出功能,而导入导出的命令貌似简单 ...
- Sqoop -- 用于Hadoop与关系数据库间数据导入导出工作的工具
Sqoop是一款开源的工具,主要用于在Hadoop相关存储(HDFS.Hive.HBase)与传统关系数据库(MySql.Oracle等)间进行数据传递工作.Sqoop最早是作为Hadoop的一个第三 ...
- Oracle数据导入导出imp/exp命令总结
racle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中. 利用 ...
- 通过 Sqoop1.4.7 将 Mysql5.7、Hive2.3.4、Hbase1.4.9 之间的数据导入导出
目录 目录 1.什么是 Sqoop? 2.下载应用程序及配置环境变量 2.1.下载 Sqoop 1.4.7 2.2.设置环境变量 2.3.设置安装所需环境 3.安装 Sqoop 1.4.7 3.1.修 ...
- 如何利用sqoop将hive数据导入导出数据到mysql
运行环境 centos 5.6 hadoop hive sqoop是让hadoop技术支持的clouder公司开发的一个在关系数据库和hdfs,hive之间数据导入导出的一个工具. 上海尚学堂 ...
- 利用sqoop将hive数据导入导出数据到mysql
一.导入导出数据库常用命令语句 1)列出mysql数据库中的所有数据库命令 # sqoop list-databases --connect jdbc:mysql://localhost:3306 ...
- MySQL数据导入导出方法与工具mysqlimport
MySQL数据导入导出方法与工具mysqlimport<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office ...
- Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令
Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中. 利 ...
随机推荐
- 5 款开源热搜项目「GitHub 热点速览」
随着 2023 年的结束,我们也迎来了 2024 年的第一个工作日,新的一年就让「GitHub 热点速递」陪你一起进入工作状态吧! 说到上周的 GitHub 热搜项目就不得不提一下,一周飙升了 8 千 ...
- 神经网络优化篇:详解梯度消失/梯度爆炸(Vanishing / Exploding gradients)
梯度消失/梯度爆炸 训练神经网络,尤其是深度神经所面临的一个问题就是梯度消失或梯度爆炸,也就是训练神经网络的时候,导数或坡度有时会变得非常大,或者非常小,甚至于以指数方式变小,这加大了训练的难度. 接 ...
- vulntarget-c-wp
vulntarget-c 信息收集 扫开的端口有web服务 访问了web页面,发现用的是laravel框架 搜索一下历史漏洞,在gayhub上找到这个可以用,能够执行简单命令 python3 expl ...
- springmvc内嵌tomcat、tomcat整合springmvc、自研国产web中间件
springmvc内嵌tomcat.tomcat整合springmvc.自研国产web中间件 这是由于公司老项目转化springboot存在太多坑,特别是hibernate事务一条就坑到跑路,你又不想 ...
- 《代码整洁之道 Clean Code》学习笔记 Part 2 - 写出优雅的函数的10条建议
大师级程序员把系统当作故事来讲,而不是当作程序来写. TLDR 短小(不超过 20 行.缩进不超过 2 层) 只做一件事 保持在同一抽象层级 用多态替代 switch 取个好的函数名 函数参数越少越好 ...
- 2023-06-30:给你一个 rows * cols 大小的矩形披萨和一个整数 k, 矩形包含两种字符: ‘A‘ (表示苹果)和 ‘.‘ (表示空白格子), 你需要切披萨 k-1 次,得到 k 块披
2023-06-30:给你一个 rows * cols 大小的矩形披萨和一个整数 k, 矩形包含两种字符: 'A' (表示苹果)和 '.' (表示空白格子), 你需要切披萨 k-1 次,得到 k 块披 ...
- 文心一言 VS 讯飞星火 VS chatgpt (49)-- 算法导论6.2 1题
一.参照图6-2的方法,说明 MAX-HEAPIFY(A,3)在数组 A=(27,17,3,16,13,10,1,5,7,12,4,8,9,0)上的操作过程. 文心一言: 下面是 MAX-HEAPIF ...
- flink 笔记
flink 分区实现 http://smartsi.club/physical-partitioning-in-apache-flink.html
- 号外!5G+X联创营华为云官网上线,5G 创业春天来了!
摘要:为助力互联网行业客户与伙伴实现降本增效.抓住新趋势,华为云发起"5G+X"联创营计划. 会议室里,产品经理和程序员们唇枪舌战,陷入激烈得讨(zheng)论(chao). 产品 ...
- Vue 应用程序性能优化:代码压缩、加密和混淆配置详解
简介在 Vue 应用程序的开发中,代码压缩.加密和混淆是优化应用程序性能和提高安全性的重要步骤. Vue CLI 是一个功能强大的开发工具,它提供了方便的配置选项来实现这些功能.本文将介绍如何使用 ...