如何在Django Admin中进行数据导入和导出

2023-04-11 00:00:00 数据 导入 导出

Django Admin内置了功能强大的数据导入和导出工具,方便管理数据。下面将介绍如何在Django Admin中进行数据导入和导出。

首先,在models.py中定义需要导入和导出的数据模型:

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=50)
    description = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

接着,在admin.py中注册这个模型,并定义数据导入和导出的函数:

from django.contrib import admin
from django.http import HttpResponse
from django.utils.encoding import smart_str
import csv

from .models import MyModel

class MyModelAdmin(admin.ModelAdmin):
    list_display = ('name', 'description', 'created_at', 'updated_at')

    def export_as_csv(self, request, queryset):
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename=my_model.csv'
        writer = csv.writer(response, csv.excel)
        response.write(u'\ufeff'.encode('utf8'))
        header_row = [
            smart_str(u"ID"),
            smart_str(u"Name"),
            smart_str(u"Description"),
            smart_str(u"Created At"),
            smart_str(u"Updated At"),
        ]
        writer.writerow(header_row)
        for obj in queryset:
            row = [
                smart_str(obj.id),
                smart_str(obj.name),
                smart_str(obj.description),
                smart_str(obj.created_at),
                smart_str(obj.updated_at),
            ]
            writer.writerow(row)
        return response
    export_as_csv.short_description = u"Export Selected as CSV"

    def import_csv(self, request, *args, **kwargs):
        if request.method == "POST":
            csv_file = request.FILES["csv_file"]
            data_set = csv_file.read().decode('utf-8')
            io_string = io.StringIO(data_set)

            # Process the data
            for row in csv.reader(io_string, delimiter=',', quotechar='"'):
                _, created = MyModel.objects.update_or_create(
                    id=row[0],
                    name=row[1],
                    description=row[2],
                    created_at=row[3],
                    updated_at=row[4]
                )

            self.message_user(request, "Your csv file has been imported")
            return redirect("..")

        return render(request, "import_csv.html", {"opts": self.model._meta})
    import_csv.short_description = "Import CSV file"

admin.site.register(MyModel, MyModelAdmin)

在这个例子中,我们定义了两个函数:

  1. export_as_csv: 将选择的数据导出为CSV文件,以逗号分隔的文本文件。

  2. import_csv: 将CSV文件导入到数据库中。

接着,在templates中创建一个html文件,用于文件上传:

{% extends 'admin/base.html' %}
{% block content %}
<h1>Import CSV for {{ opts.verbose_name_plural }}</h1>
<form action="" method="post" enctype="multipart/form-data">
  {% csrf_token %}
  <input type="file" name="csv_file">
  <button type="submit">Import</button>
</form>
{% endblock %}

最后,在Django Admin中就可以看到我们新增的导入和导出功能了。在MyModel列表页面,选择需要导出的数据,点击"Export Selected as CSV"按钮,即可将数据导出为CSV文件。同样,在MyModel列表页面,点击"Import CSV file"按钮,可以上传CSV文件,将数据导入到数据库中。

至此,已完成了在Django Admin中进行数据导入和导出的步骤。

相关文章