发布于 2026-01-06 3 阅读
0

如何导出和导入数据 | Django 包系列 #3 Django-Import-Export

如何导出和导入数据 | Django 包系列 #3

Django-Import-Export

本文同时发布于OnePublish。

欢迎来到 Django 包系列的第三篇文章。在本文中,我们将学习一个非常优秀的 Django 包,它可以轻松地导入和导出数据。

YouTube频道,提供视频教程 -反向Python YouTube

在继续之前,请访问Reverse Python以了解更多 Python 的精彩内容。

django-import-export

django -import-export库支持多种格式,包括 xls、csv、json、yaml 以及tablib支持的所有其他格式。它还集成了 Django 管理后台,使用起来非常方便。

安装与配置

为了更好地理解它,我们来创建一个项目。创建一个名为dashboard的新 Django 项目,并在其中创建一个名为reports 的新应用。

要安装该软件包,请运行以下命令:

pip install django-import-export
Enter fullscreen mode Exit fullscreen mode

然后,在settings.py文件中,将你的应用名称(例如 reports)和导入导出库添加到 INSTALLED_APPS 中:

INSTALLED_APPS = (
    ...
    'import_export',
    'reports'
)
Enter fullscreen mode Exit fullscreen mode

我还建议在settings.py 文件的末尾添加可选配置:

IMPORT_EXPORT_USE_TRANSACTIONS = True
Enter fullscreen mode Exit fullscreen mode

默认值为 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

导出数据

接下来,我们将创建一个表单,让用户选择文件格式。请更新您的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')
Enter fullscreen mode Exit fullscreen mode

非常简单,当用户选择 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 %} 
Enter fullscreen mode Exit fullscreen mode

导入数据

假设我们有一个名为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,
Enter fullscreen mode Exit fullscreen mode

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')    

Enter fullscreen mode Exit fullscreen mode

允许用户选择要导入的文件格式。

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 %} 
Enter fullscreen mode Exit fullscreen mode

文件导入完成后,请前往后台查看,您将在模型中看到导入的数据。

Django 管理员

如果您想在后台管理界面中使用导入导出功能,只需将以下代码添加到admin.py文件中即可:

from import_export.admin import ImportExportModelAdmin
from django.contrib import admin
from .models import Employee

@admin.register(Employee)
class EmployeeAdmin(ImportExportModelAdmin):
    pass
Enter fullscreen mode Exit fullscreen mode

它的样子是这样的:

反向 Python

GitHub

有些人可能会感到困惑,所以最好从我的 GitHub 仓库克隆这个项目,然后进行操作。这是我的项目 GitHub 链接:

GitHub 标志 thepylot / Django-Import-Export

使用 django-import-export 包创建报告导入导出应用程序(教程)

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

任务完成!

太棒了!你今天学到了很多有用的知识。想了解更多关于 django-import-export 的信息,请查看文档。

如果您喜欢这篇教程,请访问Reverse Python 网站,了解更多精彩的 Python 内容。

文章来源:https://dev.to/thedevtimeline/how-to-export-import-data-django-package-series-3-39mk