首页 > 其他分享 >django-import-expor处理导入和导出数据的库

django-import-expor处理导入和导出数据的库

时间:2022-10-14 23:34:33浏览次数:84  
标签:11 expor 08 django location import 2016 com

顾名思义,django-import-export是一个用于处理导入和导出数据的库。它支持多种格式,包括xls、csv、json、yaml以及tablib支持的所有其他格式。它还可以轻松与Django管理后台集成,使用起来非常方便。

安装插件

使用PIP安装

pip install django-import-export

更新settings.py:

  1.   INSTALLED_APPS = (
  2.       ...
  3.       'import_export',
  4.   )

还有一个可选的配置,我通常这样添加:

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

 

这是最简单的定义。您可以将几个配置传递给元类,如:fieldsexclude

导出数据

导出数据到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
  1.  [
  2.   {"id": 1, "name": "John", "email": "[email protected]", "birth_date": "2016-08-11", "location": "Helsinki"},
  3.   {"id": 2, "name": "Peter", "email": "[email protected]", "birth_date": "2016-08-11", "location": "Helsinki"},
  4.  {"id": 3, "name": "Maria", "email": "[email protected]", "birth_date": "2016-08-11", "location": "Barcelona"},
  5.  {"id": 4, "name": "Vitor", "email": "[email protected]", "birth_date": "2016-08-11", "location": "Oulu"},
  6.  {"id": 5, "name": "Erica", "email": "[email protected]", "birth_date": "2016-08-11", "location": "Oulu"}
  7.  ]

导出数据到YAML

dataset.yaml
  1.  - {birth_date: '2016-08-11', email: [email protected], id: 1, location: Helsinki, name: John}
  2.  - {birth_date: '2016-08-11', email: [email protected], id: 2, location: Helsinki, name: Peter}
  3.  - {birth_date: '2016-08-11', email: [email protected], id: 3, location: Barcelona, name: Maria}
  4.  - {birth_date: '2016-08-11', email: [email protected], id: 4, location: Oulu, name: Vitor}
  5.  - {birth_date: '2016-08-11', email: [email protected], id: 5, location: Oulu, name: Erica}

过滤数据

  1.  from .resources import PersonResource
  2.  from .models import Person
  3.  person_resource = PersonResource()
  4.  queryset = Person.objects.filter(location='Helsinki')
  5.  dataset = person_resource.export(queryset)
  6.  dataset.yaml
  1.  - {birth_date: '2016-08-11', email: [email protected], id: 1, location: Helsinki, name: John}
  2.  - {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的数据:

  1.  name,email,birth_date,location,id
  2.  Jessica,[email protected],2016-08-11,New York,
  3.  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):

  pass

添加之后刷新页面你就会看到导入和导出按钮。

在导入现有项目时,导入功能具有良好的差异性:

这是一个强大的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/

标签:11,expor,08,django,location,import,2016,com
From: https://www.cnblogs.com/beichengshiqiao/p/16793322.html

相关文章

  • django models 过滤/排除指定字段的多个值
    fromoperatorimportor_fromdjango.db.modelsimportQfromfunctoolsimportreducefilter_ip_list=["不能为空"]#排除models.ServerHost.objects.filter(b......
  • 查找 export 、import memory 的位置
    朋友问个问题,说遇到有人export内存,但是找不到哪儿import看代码应该是哪儿做了隐士增强,然后那取出来用的我第一反应是用tcode:CODE_SCANNER 或者程序RPR_ABAP_SOURCE_SCAN......
  • ubuntu下pycharm 调试报错:.tensorrt import * ImportError: libcudnn.so.8: No such f
    ubuntu下pycharm调试报错:.tensorrtimport*ImportError:libcudnn.so.8:Nosuchfileordirectory解决方法:pycharm配置环境cuda的环境变量。run=>editconfiguratio......
  • vue3+vite引入插件unplugin-auto-import
    自动引入compositionapi,不需要再手动引入。github地址:https://github.com/antfu/unplugin-auto-import下载npmiunplugin-auto-import-D修改vite.config.ts文件i......
  • django部署
    https://www.liujiangblog.com/course/django/181理论上配置完nginx就可以看到Nginx欢迎界面,如果没有,可能是端口问题。用天翼云,在备案之前不允许使用80端口(默认端口,zrhan......
  • JS 中的require 和 import 区别
    这两个都是为了JS模块化编程使用.遵循规范require 是AMD规范引入方式import是es6的一个语法标准,如果要兼容浏览器的话必须转化成es5的语法调用时间require是运......
  • 【Python】关于Django如何处理前后端分离时的POST请求
    在目前的大环境趋势下,前后端分离已经是项目开发的主流,而Django在后端领域也受到众多程序员的青睐,那么在前后端分离开发时,经常会遇到django本身内置的csrf拦截保护机制本文......
  • EasyPoi 导出Excel(ExcelExportEntity生成表头)
    [引入依赖]<!--easypoi--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><ve......
  • Django第三课之模板变量及模板过滤器
    在写这篇博客的时候,我们先回顾一下上面几节课的内容。1安装python。我们们使用的是linux的虚拟机,一般在公司开发很少在本地开发,为什么?很简单,本地开发会出现很多与linux的不......
  • Django数据库迁移遇到的问题
    报错raiseMigrationSchemaMissing("Unabletocreatethedjango_migrationstable(%s)"%exc) Django 执行迁移生成表:pythonmanage.pymigrate报错:raiseMigrati......