数据导入导出涉及多种格式(Excel、csv、json等),使用不同脚本繁琐重复。Django-import-export库为此问题提供解决方案。本文将详细介绍其特点、安装配置、Resource编写、Admin配置,并提供应用案例,助您轻松管理数据导入导出。
特点:
多格式支持(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>
这样后台列表页就能看到有导入导出按钮。
如果只想导出不想有导入,改成如下:
<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>
暂无评论内容