发布于 2026-01-06 2 阅读
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