顾名思义,django-import-export是一个用于处理导入和导出数据的库。它支持多种格式,包括xls、csv、json、yaml以及tablib支持的所有其他格式。它还可以轻松与Django管理后台集成,使用起来非常方便。
使用PIP安装
pip install django-import-export
更新settings.py:
INSTALLED_APPS = (
'import_export',
还有一个可选的配置,我通常这样添加:
IMPORT_EXPORT_USE_TRANSACTIONS = True
默认值为False。它确定库是否会在数据导入中使用数据库事务,以确保安全。
编写资源Resources
django-import-export库使用Resource的概念,它的类定义非常类似于Django处理模型表单和管理类的方式。
在文档中,作者建议将与资源相关的代码放在admin.py文件。但是,如果实现与Django admin没有关系,我通常更喜欢在app文件夹里创建一个名为resources.py。
models.py
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=30)
email = models.EmailField(blank=True)
birth_date = models.DateField()
location = models.CharField(max_length=100, blank=True)
resources.py
from import_export import resources
from .models import Person
class PersonResource(resources.ModelResource):
class Meta:
model = Person
这是最简单的定义。您可以将几个配置传递给元类,如:fields
, exclude
导出数据到CSV
from .resources import PersonResource
person_resource = PersonResource()
dataset = person_resource.export()
dataset.csv
id,name,email,birth_date,location
1,John,[email protected],2016-08-11,Helsinki
2,Peter,[email protected],2016-08-11,Helsinki
3,Maria,[email protected],2016-08-11,Barcelona
4,Vitor,[email protected],2016-08-11,Oulu
5,Erica,[email protected],2016-08-11,Oulu
导出数据到JSON
dataset.json
{"id": 1, "name": "John", "email": "[email protected]", "birth_date": "2016-08-11", "location": "Helsinki"},
{"id": 2, "name": "Peter", "email": "[email protected]", "birth_date": "2016-08-11", "location": "Helsinki"},
{"id": 3, "name": "Maria", "email": "[email protected]", "birth_date": "2016-08-11", "location": "Barcelona"},
{"id": 4, "name": "Vitor", "email": "[email protected]", "birth_date": "2016-08-11", "location": "Oulu"},
{"id": 5, "name": "Erica", "email": "[email protected]", "birth_date": "2016-08-11", "location": "Oulu"}
导出数据到YAML
dataset.yaml
- {birth_date: '2016-08-11', email: [email protected], id: 1, location: Helsinki, name: John}
- {birth_date: '2016-08-11', email: [email protected], id: 2, location: Helsinki, name: Peter}
- {birth_date: '2016-08-11', email: [email protected], id: 3, location: Barcelona, name: Maria}
- {birth_date: '2016-08-11', email: [email protected], id: 4, location: Oulu, name: Vitor}
- {birth_date: '2016-08-11', email: [email protected], id: 5, location: Oulu, name: Erica}
from .resources import PersonResource
from .models import Person
person_resource = PersonResource()
queryset = Person.objects.filter(location='Helsinki')
dataset = person_resource.export(queryset)
dataset.yaml
- {birth_date: '2016-08-11', email: [email protected], id: 1, location: Helsinki, name: John}
- {birth_date: '2016-08-11', email: [email protected], id: 2, location: Helsinki, name: Peter}
导出到CSV视图
from django.http import HttpResponse
from .resources import PersonResource
def export(request):
person_resource = PersonResource()
dataset = person_resource.export()
response = HttpResponse(dataset.csv, content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="persons.csv"'
return response
导出到Excel视图
from django.http import HttpResponse
from .resources import PersonResource
def export(request):
person_resource = PersonResource()
dataset = person_resource.export()
response = HttpResponse(dataset.xls, content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename="persons.xls"'
return response
查看new_persons.csv的数据:
name,email,birth_date,location,id
Jessica,[email protected],2016-08-11,New York,
Mikko,[email protected],2016-08-11,Jyväskyla,
id必须存在,因为它是主键。但是它会生成,所以我们不需要指定值。
import.html
{% extends 'base.html' %}
{% block content %}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="myfile">
<button type="submit">Upload</button>
</form>
{% endblock %}
views.py
from tablib import Dataset
def simple_upload(request):
if request.method == 'POST':
person_resource = PersonResource()
dataset = Dataset()
new_persons = request.FILES['myfile']
imported_data = dataset.load(new_persons.read())
result = person_resource.import_data(dataset, dry_run=True) # Test the data impor
if not result.has_errors():
person_resource.import_data(dataset, dry_run=False) # Actually import now
return render(request, 'core/simple_upload.html')
Django后台管理集成
在admin.py里使用ImportExportModelAdmin
,而不是ModelAdmin
from import_export.admin import ImportExportModelAdmin
from django.contrib import admin
from .models import Person
@admin.register(Person)
class PersonAdmin(ImportExportModelAdmin):
添加之后刷新页面你就会看到导入和导出按钮。
在导入现有项目时,导入功能具有良好的差异性:
这是一个强大的Django库,你可以用它做更多的事情。比如只想有导出功能,可以使用ExportMixin。
from .models import Person
from django.contrib import admin
from import_export.admin import ExportMixin
class PersonAdmin(ExportMixin, admin.ModelAdmin):
resource_class = PersonResource
admin.site.register(Person, BookAdmin)
详细文档地址:https://django-import-export.readthedocs.io/en/latest/
文章来源:Django中文网 作者:夜之舞。
Django实战: channels+celery+websocket打造聊天机器人(附源码)
Django集成富文本编辑器summernote教程
Django实战: 手把手教你配置Django SimpleUI打造美丽后台(多图)
顾名思义,django-import-export是一个用于处理导入和导出数据的库。它支持多种格式,包括xls、csv、json、yaml以及tablib支持的所有其他格式。它还可以轻松与...
Django-xadmin+django-import-export导入导出的实现Django点滴系列是本人Django使用的一个记录,主要用于踩坑填坑,如果能帮到你,就是我荣幸!
书接上回, 上一篇博客 Django点滴(1)xadmin+rule对象级权限的实现记录了xadmin对象级权限相关应用,本篇将目光投向xadmin的导入导出功能。
1. 需求vs现状1.1 需求要求做一个ERP后台
django-import-export 这个第三方包可以导入也可以导出 ,导入以前用原生的写过了,我们本次展示导出。
python 3.8.0
django 2.2.0
pip install django-import-export
#settings.py
INSTALLED_APPS=[
"import_export",
引用你已经建好的models.py,对导出内容进行设置,如果内...
pip install django-import-export
2.在settings 的INSTALLED_APPS中添加 django-import-export:
INSTALLED_APPS = [
# primary
之前对 mysql 不是很熟悉,偷懒一直用 sqlite3 作为 django 的默认数据库.后来嘛,时代变了,一直琢磨这如何把数据从 sqlite3 导入到 mysql 中去.
经过一番 stackoverflow 找到如下两种方案:
通过脚本连接两个数据库,做数据的传递(感觉麻烦,而且过程中一定会有很多坑等着我)
通过 django 的 crm 管理系统写脚本传递数据(不用自己写 sql 语...
本文介绍django-import-export在关联外键时,导出可以导出可读字样(而非关联id),导入通过可读字眼进行导入(而非关联id)
模型设计如下:
# models.py
from django.db import models
# Create your models here.
class User(models.Model):
gender_by_choice = ...
django-import-export 是一个 Django 应用程序,它提供了一种简单的方法来导入和导出 Django 模型的数据。它支持多种数据格式,包括 Excel 格式。
使用 django-import-export 导入和导出 Excel 数据时,默认情况下会采用以下格式:
1. Excel 文件的第一行将被用作表头。
2. 每一行数据都会映射为一个 Django 模型实例,其中每一列的值都会被转换为相应的模型字段的值。
如果你的 Excel 文件中有多个工作表,你可以使用 `import_export.formats.base_formats.XLS` 或 `import_export.formats.base_formats.XLSX` 格式指定要导入或导出的工作表。
以下是一个使用 django-import-export 导入和导出 Excel 数据的示例代码:
```python
from import_export import resources
from import_export.admin import ImportExportModelAdmin
from django.contrib import admin
from .models import MyModel
class MyModelResource(resources.ModelResource):
class Meta:
model = MyModel
@admin.register(MyModel)
class MyModelAdmin(ImportExportModelAdmin):
resource_class = MyModelResource
在这个示例中,`MyModelResource` 类定义了如何将 Excel 数据映射到 `MyModel` 模型中。`MyModelAdmin` 类使用 `ImportExportModelAdmin` 类来为 `MyModel` 模型提供导入和导出功能,并指定使用 `MyModelResource` 类来处理数据。