Django-Import-Export插件控制数据导入流程
前言
之前写过两篇跟这个插件有关的文章,可以回顾一下:
最近有个朋友留言问我一个关于django-import-export插件的问题
为了形象表达这个问题,我举个书籍管理的例子来描述一下
数据库表
id name price 1 book1 10 2 book2 20 3 book3 30 要导入的Excel表
id name price tax 4 book4 40 5 5 book5 50 6 6 book6 60 7 可以看到,Excel里每本书都有价格和税两个属性,但数据库只有价格一个属性
导入的时候,需要把每本书的价格+税,才是要存入数据的最终价格
在以前,这种问题场景我会建议直接用pandas来处理数据然后导入,django-import-export插件只用来做数据导出,因为它的文档很简陋,给的例子很难解决实际问题,往往某个需求用pandas手动处理只需要很少时间,用这个插件还得去啃源码和简陋的文档,效率太低了。
不过本着折腾的精神,还是来研究一下这个用django-import-export到底能不能实现这个功能。(结果当然是可以的,不然也没有这篇文章了)
分析
首先是看官网文档,有一个节点叫import data workflow
地址:https://django-import-export.readthedocs.io/en/latest/import_workflow.html
import_data(dataset, dry_run=False, raise_errors=False)The
import_data()method ofResourceis responsible for importing data from a given dataset.
datasetis required and expected to be atablib.Datasetwith a header row.
dry_runis a Boolean which determines if changes to the database are made or if the import is only simulated. It defaults toFalse.
raise_errorsis a Boolean. IfTrue, import should raise errors. The default isFalse, which means that eventual errors and traceback will be saved inResultinstance.
根据文档,在导入数据的时候,我们可以通过import_data这个hook来对要导入的数据进行处理
然后这个hook有个参数,dataset,这个是tablib的东西
关于这个tablib,我之前没用过,查了一下,是requests作者做的库,那想来应该不会差
官网文档是:https://tablib.readthedocs.io/en/stable/tutorial.html
写代码
直接把官方的代码例子拿来用
代码仓库:https://github.com/django-import-export/django-import-export
同样是这个书籍管理的
Models代码
来看看它的model设计
class Book(models.Model):
name = models.CharField('Book name', max_length=100)
author = models.ForeignKey(Author, blank=True, null=True, on_delete=models.CASCADE)
author_email = models.EmailField('Author email', max_length=75, blank=True)
imported = models.BooleanField(default=False)
published = models.DateField('Published', blank=True, null=True)
published_time = models.TimeField('Time published', blank=True, null=True)
price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
added = models.DateTimeField(blank=True, null=True)
categories = models.ManyToManyField(Category, blank=True)
def __str__(self):
return self.name
很多字段
要导入的数据
依然是官方提供的,各种格式都有,我选csv的,比较方便
id,name,author_email
1,Some book,test@example.com
转换成表格长这样
| id | name | author_email |
|---|---|---|
| 1 | Some book | test@example.com |
可以看到字段比model定义的少很多
我们要在导入的时候,给dataset加上价格(price)属性
Resources代码
这是原本的代码
class BookResource(ModelResource):
class Meta:
model = Book
def for_delete(self, row, instance):
return self.fields['name'].clean(row) == ''
return super(BookResource, self).import_data(
dataset, dry_run, raise_errors, use_transactions,
collect_failed_rows, rollback_on_validation_errors, **kwargs
现在我们要加一个hook来处理导入的数据
代码如下
def import_data(self, dataset: tablib.Dataset, dry_run=False, raise_errors=False,
use_transactions=None, collect_failed_rows=False,
rollback_on_validation_errors=False, **kwargs):
cols = []
for item in dataset['id']:
cols.append(int(item) * 99)
dataset.append_col(cols, header='price')
print(dataset)
return super(BookResource, self).import_data(
dataset, dry_run, raise_errors, use_transactions,
collect_failed_rows, rollback_on_validation_errors, **kwargs
)
使用DataSet的append_col方法来添加一个新的列
关于这个DataSet的更多操作请参考Tablib的文档
这部分的具体操作可以根据实际需求来做修改,这里我直接简单粗暴的把ID乘以99
处理完DataSet之后记得要执行父类的import_data,完成数据导入的操作。
效果
在admin后台执行导入,可以得到以下的结果
可以看到price属性变成99
| ID | NAME | AUTHOR | AUTHOR_EMAIL | IMPORTED | PUBLISHED | PUBLISHED_TIME | PRICE | ADDED | CATEGORIES | |
|---|---|---|---|---|---|---|---|---|---|---|
| New | 1 | Some book | test@example.com | 0 | 99 |
就OK了,搞定~
其实还挺简单的,只是官方文档太简陋了,连个例子的没有,只能自己摸索一下
参考资料
虽然前面都有链接,这里再总结一下吧
- 插件文档:https://django-import-export.readthedocs.io/en/latest/import_workflow.html
- 插件项目主页:https://github.com/django-import-export/django-import-export
- Tablib文档:https://tablib.readthedocs.io/en/stable/tutorial.html
Django-Import-Export插件控制数据导入流程的更多相关文章
- Django import / export实现数据库导入导出
使用django-import-export库,导入导出数据,支持csv.xls.json.html等格式 官网:http://django-import-export.readthedocs.io/ ...
- sqlite3 import/export db sqlite 导入 导出 数据
export: $ sqlite3 xxx.db3 > .output xxx.sql >.dump > .q import: $ sqlite3 xxx.db3 > .rea ...
- [转] ES6 import/export:模块导入导出方式
export导出语法 // default exports export default 42; export default {}; export default []; export defaul ...
- django开发环境搭建(参考流程)
django开发环境搭建(参考流程) 2013-08-08 01:09:06 分类: LINUX 原文地址:django开发环境搭建(参考流程) 作者:bailiangcn 对于一个初学者,在实际的开 ...
- 总账:日记账导入流程(文档 ID 1591640.1)
文档内容 概要 历史记录 详细信息 GL_INTERFACE_CONTROL GL_INTERFACE_HISTORY GL_IMPORT_REFERENCES 摘要 ...
- 前端 高级 (二十五)vue2.0项目实战一 配置简要说明、代码简要说明、Import/Export、轮播和列表例子
一.启动服务自动打开浏览器运行 二.配置简要说明 1.node_modules 安装好的依赖文件,中间件等,所在位置 2.package.jason 配置当前项目要安装的中间件和依赖文件 { &quo ...
- require/exports 与 import/export 的区别?
文章作者:寸志链接:https://www.zhihu.com/question/56820346/answer/150724784来源:知乎 遵循的模块化规范不一样 模块化规范:即为 JavaScr ...
- 探讨ES6的import export default 和CommonJS的require module.exports
今天来扒一扒在node和ES6中的module,主要是为了区分node和ES6中的不同意义,避免概念上的混淆,同时也分享一下,自己在这个坑里获得的心得. 在ES6之前 模块的概念是在ES6发布之前就出 ...
- django admin后台插件:django-suit入门
去年9月底开始用django来做公司内部项目,开始对django有了一些了解,感觉django真的蛮强大的(也有很多人推荐flask,将来有空的话我会试试).今天的话只是介绍一个小东西,django管 ...
随机推荐
- Acwing785.快速排序
Acwing785.快速排序 快排模板: y总教学大法好~: #include <iostream> using namespace std; const int N = 1000010; ...
- 这就是艺术「GitHub 热点速览 v.22.25」
作者:HelloGitHub-小鱼干 不知道写了那么久代码的你,是否还记得"代码写诗"这个词,它是用来形容代码的优雅.但是本周的项目,虽然你看到的是代码的成品,也会惊讶于它的艺术感 ...
- DotNET程序员面向API编程的正确姿势
原文:https://blog.csdn.net/u013201439/article/details/49981071 补充:按照步骤成功加载文档后,选择索引可以快速发现相关的内容,如图
- HDFS数据平衡
一.datanode之间的数据平衡 1.1.介绍 Hadoop 分布式文件系统(Hadoop Distributed FilSystem),简称 HDFS,被设计成适合运行在通用硬件上的分布式文件 ...
- 记一次 .NET 某新能源系统 线程疯涨 分析
一:背景 1. 讲故事 前段时间收到一个朋友的求助,说他的程序线程数疯涨,寻求如何解决. 等我分析完之后,我觉得这个问题很有代表性,所以拿出来和大家分享下,还是上老工具 WinDbg. 二: WinD ...
- Oracle数据库控制文件多路复用
Oracle数据库控制文件多路复用多路复用控制文件,指的是在系统不同的位置上同时存放多个控制文件的副本,此时如果某个路径对应的磁盘发送物理损坏导致该控制文件损坏,就可以通过另一个磁盘上的控制文件进行恢 ...
- MC34063降压电路
MC34063芯片由温度自动补偿功能的基准电压发生器.比较器.占空比可控振荡器. 触发器和大电流输出开关电路等组成,具有功能齐全.价格低廉.体积小.效率高.仅需少量外部元器件等优点,其主要特性如表所示 ...
- 最著名的著名的比特币BTC钱包地址-中本聪的钱包
最著名的著名的比特币BTC钱包地址-中本聪的钱包1.比特币创始人中本聪 1PTFYUG6nCzRrByoRfGT5kefUNuZjNF84o这个地址还是比特币的创世地址,比特币从未移动过,其中的50币 ...
- 各种Git Bash乱码解决
乱码情景一: 当使用git log 出现乱码时,修改 %GIT_HOME%\etc\gitconfig 文件,加入如下内容: [gui] encoding = utf-8[i18n] commiten ...
- git.exe pull --progress -v --no-rebase "origin" master
git.exe pull --progress -v --no-rebase "origin" master remote: You do not have permission ...