首页 > 其他分享 >Django数据导入导出神器django-import-export使用

Django数据导入导出神器django-import-export使用

时间:2024-07-29 19:20:58浏览次数:7  
标签:name models django Book export import class

前言

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 这个插件还有很多其他的功能,不过现阶段已经满足了我的工作需要,所以我也没有再去深入,还有什么功能需要可以直接翻文档吧。

目前我用到的还是以导出为主,导入的就是更新和新增这一块,没多少花样,如果接下来遇到其他新的需求,我会再更新一篇文章来介绍更新这个插件的功能~

参考资料

 

作者:DealiAxy

 

出处:https://www.cnblogs.com/deali/p/14329228.html

 

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

 

 

标签:name,models,django,Book,export,import,class
From: https://www.cnblogs.com/ubirdy/p/18330834

相关文章

  • 验证码原理与Django实现--简单图片验证码
    前言在网页中常见图片中包含数字字母的验证码如下如果将其简化,那么我们可以认为验证码是由数字字母加上遮挡的线段所构成。本文,我们不妨先解决其中数字与字母的简单生成数字字母的生成原理与代码实现 首先,可以使用PIL库中的类Image和ImageDraw,用于生成图片和调用画笔对生......
  • 如何在django项目中设置login_required,我没有使用django inbuild身份验证登录?
    用户无法通过输入任何页面的url进入任何页面我是否需要更改设置中的任何内容.py我没有使用django内置身份验证进行登录。view.py用于登录每个仪表板,defasset_login(request):ifrequest.method=='POST':username=request.POST.get('user_id')passw......
  • Django 页面不显示任何内容
    我的“新闻”页面无法正常工作,它正在数据库中保存信息,但不显示任何内容。这里是HTML:{%extends'base.html'%}{%blockcontent%}<h1class='product'>News</h1>{%foriteminnew%}<div><br><strong><ahref='/news/{{item.......
  • 计算机毕业设计django+vue保险业务信息管理系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着保险行业的蓬勃发展,保险业务量的激增对保险公司的信息管理提出了更高的要求。传统的业务管理方式往往依赖于人工操作和纸质文档,不仅效......
  • 计算机毕业设计django+vueHPV疫苗预约系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会对健康重视程度的日益提升,疫苗接种成为了预防疾病、保障公众健康的重要措施。其中,HPV(人乳头瘤病毒)疫苗作为预防宫颈癌等严重疾病......
  • 如何使用Visual Studio代码调试django
    我是django开发领域的新人,使用Xcode和相关IDE进行桌面/移动应用程序开发。我必须使用Django,我想知道是否有一个高效的使用VisualStudioCode(或Atom)进行调试的方法。与DjangoIDE相关的任何帮助也会有所帮助。使用VisualStu......
  • 计算机毕业设计django+vueWMS仓库管理系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着物流行业的快速发展和企业规模的扩大,仓库管理成为企业运营中不可或缺的一环。传统的仓库管理方式依赖于人工记录和手工操作,不仅效率低......
  • 计算机毕业设计django+vue超市管理系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着零售业的快速发展和消费者需求的多样化,超市作为人们日常生活中不可或缺的一部分,其管理效率和服务质量直接影响到顾客的购物体验和超市......
  • 计算机毕业设计django+vue超市管理系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和商业模式的不断创新,超市作为零售业的重要组成部分,面临着日益激烈的市场竞争和消费者需求的多样化。传统的超市管......
  • Django项目快速上手:从安装到创建应用
    Django项目快速上手:从安装到创建应用安装Django首先,确保你已经安装了Python和pip。然后,使用以下命令来安装Django:pipinstalldjango安装成功后,你就可以开始创建Django项目了。创建Django项目打开你的终端或命令提示符,然后使用django-admin命令来创建一个新的Djan......