Django-Import-Export
使用 django-import-export 包创建报表应用(教程)
入门
本教程适用于Python 3+和 Django 2+。
安装依赖项:
python3 -m pip3 install -r requirements.txt
并运行以下命令:
python3 manage.py makemigrations reports
python3 manage.py migrate
python3 manage.py runserver
本文同时发布于OnePublish。
欢迎来到 Django 包系列的第三篇文章。在本文中,我们将学习一个非常优秀的 Django 包,它可以轻松地导入和导出数据。
YouTube频道,提供视频教程 -反向Python YouTube
在继续之前,请访问Reverse Python以了解更多 Python 的精彩内容。
django -import-export库支持多种格式,包括 xls、csv、json、yaml 以及tablib支持的所有其他格式。它还集成了 Django 管理后台,使用起来非常方便。
为了更好地理解它,我们来创建一个项目。创建一个名为dashboard的新 Django 项目,并在其中创建一个名为reports 的新应用。
要安装该软件包,请运行以下命令:
pip install django-import-export
然后,在settings.py文件中,将你的应用名称(例如 reports)和导入导出库添加到 INSTALLED_APPS 中:
INSTALLED_APPS = (
...
'import_export',
'reports'
)
我还建议在settings.py 文件的末尾添加可选配置:
IMPORT_EXPORT_USE_TRANSACTIONS = True
默认值为 False。它决定库在数据导入时是否使用数据库事务。
本节之后,我将向您展示项目的主要部分。如果您不知道如何配置 urls.py 或模板,我会在文章末尾提供 GitHub 代码库链接,您可以克隆并运行该项目。
在你的models.py 文件中创建一个名为 Employee 的模型:
from django.db import models
class Employee(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=60)
email = models.EmailField(blank=True)
day_started = models.DateField()
location = models.CharField(max_length=100, blank=True)
def __str__(self):
return self.first_name
django-import-export 库使用 Resource 的概念,这是一种类定义,与 Django 处理模型表单和管理类的方式非常相似。
如果你想直接从 Django 管理后台处理数据,那么你应该把代码放在admin.py文件中。
但是,我们这个项目的实现与 Django 管理后台无关,所以让我们在 app 文件夹内创建resources.py文件。
from import_export import resources
from .models import Employee
class EmployeeResource(resources.ModelResource):
class Meta:
model = Employee
接下来,我们将创建一个表单,让用户选择文件格式。请更新您的views.py 文件:
from django.shortcuts import render
from django.http import HttpResponse
from tablib import Dataset
from .resources import EmployeeResource
from .models import Employee
def export_data(request):
if request.method == 'POST':
# Get selected option from form
file_format = request.POST['file-format']
employee_resource = EmployeeResource()
dataset = employee_resource.export()
if file_format == 'CSV':
response = HttpResponse(dataset.csv, content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="exported_data.csv"'
return response
elif file_format == 'JSON':
response = HttpResponse(dataset.json, content_type='application/json')
response['Content-Disposition'] = 'attachment; filename="exported_data.json"'
return response
elif file_format == 'XLS (Excel)':
response = HttpResponse(dataset.xls, content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename="exported_data.xls"'
return response
return render(request, 'export.html')
非常简单,当用户选择 JSON 格式时,文件将导出为 JSON 格式;当用户选择 CSV 格式时,文件将导出为 CSV 格式。
export.html
{% extends 'base.html' %}
{% block content %}
<h3>Export Data</h3>
<p>exporting from database</p>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>Please select format of file.</p>
<select name="file-format" class="form-control my-3">
<option selected>Choose format...</option>
<option>CSV</option>
<option>JSON</option>
<option>XLS (Excel)</option>
</select>
<button class="btn btn-primary" type="submit">Export</button>
</form>
<a href="{% url 'home' %}">Return Home View</a>
{% endblock %}
假设我们有一个名为employees.csv 的文件:
first_name,last_name,email,day_started,location,id
Peter,Parker,peter@parker.com,2015-05-18,New York,
James,Bond,james007@bond.com,2014-08-11,London,
id必须存在,因为它是主键。它将自动生成。
因此,我们需要将 CSV 或 JSON 文件导入数据库。请将以下函数添加到views.py文件中:
def import_data(request):
if request.method == 'POST':
file_format = request.POST['file-format']
employee_resource = EmployeeResource()
dataset = Dataset()
new_employees = request.FILES['importData']
if file_format == 'CSV':
imported_data = dataset.load(new_employees.read().decode('utf-8'),format='csv')
result = employee_resource.import_data(dataset, dry_run=True)
elif file_format == 'JSON':
imported_data = dataset.load(new_employees.read().decode('utf-8'),format='json')
# Testing data import
result = employee_resource.import_data(dataset, dry_run=True)
if not result.has_errors():
# Import now
employee_resource.import_data(dataset, dry_run=False)
return render(request, 'import.html')
允许用户选择要导入的文件格式。
import.html
{% extends 'base.html' %}
{% block content %}
<h3>Import Data</h3>
<p>importing to database</p>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="importData">
<p>Please select format of file.</p>
<select name="file-format" class="form-control my-3">
<option selected>Choose format...</option>
<option>CSV</option>
<option>JSON</option>
</select>
<button class="btn btn-primary" type="submit">Import</button>
</form>
<a href="{% url 'home' %}">Return Home View</a>
{% endblock %}
文件导入完成后,请前往后台查看,您将在模型中看到导入的数据。
如果您想在后台管理界面中使用导入导出功能,只需将以下代码添加到admin.py文件中即可:
from import_export.admin import ImportExportModelAdmin
from django.contrib import admin
from .models import Employee
@admin.register(Employee)
class EmployeeAdmin(ImportExportModelAdmin):
pass
它的样子是这样的:
有些人可能会感到困惑,所以最好从我的 GitHub 仓库克隆这个项目,然后进行操作。这是我的项目 GitHub 链接:
使用 django-import-export 包创建报表应用(教程)
本教程适用于Python 3+和 Django 2+。
安装依赖项:
python3 -m pip3 install -r requirements.txt
并运行以下命令:
python3 manage.py makemigrations reports
python3 manage.py migrate
python3 manage.py runserver
太棒了!你今天学到了很多有用的知识。想了解更多关于 django-import-export 的信息,请查看文档。
如果您喜欢这篇教程,请访问Reverse Python 网站,了解更多精彩的 Python 内容。