数据导入导出轻松搞定:Django-import-export库详解

数据导入导出涉及多种格式(Excel、csv、json等),使用不同脚本繁琐重复。Django-import-export库为此问题提供解决方案。本文将详细介绍其特点、安装配置、Resource编写、Admin配置,并提供应用案例,助您轻松管理数据导入导出。

图片[1]-数据导入导出轻松搞定:Django-import-export库详解-山海云端论坛

特点:

多格式支持(Excel、CSV、JSON等及tablib支持的其他格式)

集成导入管理

预览导入更改

集成导出管理

根据管理员过滤器导出数据

一、安装

配置setting.py

<code># settings.py</code><code>INSTALLED_APPS = (</code><code> ...</code><code> 'import_export',</code><code>)</code>

二、编写Resource

Resource的写法l类似于Model、Form,官方例子,models.py

<code>class Author(models.Model):</code><code>    name = models.CharField(max_length=100)</code><code>def __str__(self):</code><code>return self.name</code>
<code>class Category(models.Model):</code><code>    name = models.CharField(max_length=100)</code><code>def __str__(self):</code><code>return self.name</code>
<code>class Book(models.Model):</code><code> name = models.CharField('Book name', max_length=100)</code><code> author = models.ForeignKey(Author, blank=True, null=True)</code><code> author_email = models.EmailField('Author email', max_length=75, blank=True)</code><code> imported = models.BooleanField(default=False)</code><code> published = models.DateField('Published', blank=True, null=True)</code><code> price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)</code><code> categories = models.ManyToManyField(Category, blank=True)</code>
<code>def __str__(self):</code><code>return self.name</code>

现在要导入数据到Book表,开始编写我们的Resource,在app所在目录下创建resource.py文件来放Resource类

<code>from import_export import resources</code><code>from core.models import Book</code>
<code>class BookResource(resources.ModelResource):</code><code>class Meta:</code><code> model = Book</code>

三、配置Admin

修改admin.py,把admin.ModelAdmin继承改成ImportExportModelAdmin即可,代码如下

<code>from .models import Book</code><code>from import_export.admin import ImportExportModelAdmin</code>
<code>class BookAdmin(ImportExportModelAdmin):</code><code> resource_class = BookResource</code>
<code>admin.site.register(Book, BookAdmin)</code>

这样后台列表页就能看到有导入导出按钮。

640如果只想导出不想有导入,改成如下:

<code>from .models import Book</code><code>from django.contrib import admin</code><code>from import_export.admin import ExportMixin</code>
<code>class BookAdmin(ExportMixin, admin.ModelAdmin):</code><code> resource_class = BookResource</code>
<code>admin.site.register(Book, BookAdmin)</code>

如果只导入不导出,把ExportMixin换成ImportMixin就行。

四、应用案例

1、调整字段顺序

要导入的数据(Excel、csv)可能字段顺序和Model定义的字段顺序不一样,这时就需要调整Resource

<code>class BookResource(resources.ModelResource):</code>
<code> class Meta:</code><code> model = Book</code><code> fields = ('id', 'name', 'author', 'price',)</code><code> export_order = ('id', 'price', 'author', 'name')</code>

其中export_order是导出的字段顺序,fields是指定哪些字段需要导入。

2、排除字段和设置主键字段

<code>class BookResource(resources.ModelResource):</code><code> class Meta:</code><code> model = Book</code><code> exclude = ['id']<em>#排除字段  </em></code><code> import_id_fields = ['name']<em>#设置主键字段 </em></code>

3、自定义列名

<code>from import_export.fields import Field</code>
<code>class BookResource(resources.ModelResource):</code><code> id = Field(attribute='id', column_name='编号')</code><code> name = Field(attribute='name', column_name='书籍名称')</code>
<code> class Meta:</code><code> model = Book</code><code> export_order = ('id', 'name', 'author', 'price',)</code>

其中Field里的attribute是指字段对应Model里的属性名,column_name是列名。column_name也可以直接从verbose_name拿来用

4、加入自定义的列

<code>from import_export.fields import Field</code>
<code>class BookResource(resources.ModelResource):</code><code> id = Field(attribute='id', column_name='编号')</code><code> name = Field(attribute='name', column_name='书籍名称')</code><code> new_field = Field(column_name='新字段')</code>
<code> class Meta:</code><code> model = Book</code><code> export_order = ('id', 'name', 'author', 'price', 'new_field')</code>
<code> @staticmethod</code><code> def dehydrate_new_field(instance: Book):</code><code> return '新字段内容'</code>
© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容