入门

介绍

本节介绍如何开始使用导入-导出功能。我们将以:ref:`示例应用程序<exampleapp>`作为指南。

import-export 可以按照此处描述以编程方式使用,也可以与 Django Admin 界面 集成。

测试数据

tests/core/exports 目录中有可用于测试数据导入的示例文件。

测试模型

例如,我们将使用一个简化的书籍应用。以下是我们的 models.py:

# app/models.py

class Author(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class Category(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class Book(models.Model):
    name = models.CharField('Book name', max_length=100)
    author = models.ForeignKey(Author, blank=True, null=True)
    author_email = models.EmailField('Author email', max_length=75, blank=True)
    imported = models.BooleanField(default=False)
    published = models.DateField('Published', blank=True, null=True)
    price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    categories = models.ManyToManyField(Category, blank=True)

    def __str__(self):
        return self.name

创建资源

为了将导入导出功能与我们的``Book``模型集成,我们将在``admin.py``中创建一个:class:`~import_export.resources.ModelResource`类,用于描述该资源如何被导入或导出:

# app/admin.py

from import_export import resources
from core.models import Book

class BookResource(resources.ModelResource):

    class Meta:
        model = Book  # or 'core.Book'

导入数据

让我们导入一些数据!

1>>> import tablib
2>>> from import_export import resources
3>>> from core.models import Book
4>>> book_resource = resources.modelresource_factory(model=Book)()
5>>> dataset = tablib.Dataset(['', 'New book'], headers=['id', 'name'])
6>>> result = book_resource.import_data(dataset, dry_run=True)
7>>> print(result.has_errors())
8False
9>>> result = book_resource.import_data(dataset, dry_run=False)

在第四行我们使用:func:~import_export.resources.modelresource_factory`创建一个默认的:class:`~import_export.resources.ModelResource。通过这种方式创建的``ModelResource``类等同于:ref:base-modelresource`章节示例中的类。关于此函数更高级的用法,请参阅:ref:`using_modelresource_factory

在第五行中,创建了一个带有列 idnameDataset 以及一个书籍条目。始终需要存在一个唯一标识实例的字段(或字段组合)。这是为了导入过程可以管理创建/更新。在本例中,我们使用 id。更多信息,请参阅 advanced_usage:创建或更新模型实例

在其余代码中,我们首先假装使用 import_data()dry_run 设置导入数据,然后检查是否有错误,这次实际导入数据。

参见

/导入工作流程

有关导入工作流程及其自定义选项的详细说明。

删除数据

要在导入期间删除对象,请在您的:class:`~import_export.resources.Resource`类上实现:meth:`~import_export.resources.Resource.for_delete`方法。您应添加自定义逻辑以标记哪些行将被删除。

例如,假设您希望在导入数据集中有一个字段来指示哪些行应被删除。您可以包含一个名为*delete*的字段,其值为1或0。

在这种情况下,声明资源如下::

class BookResource(resources.ModelResource):

    def for_delete(self, row, instance):
        return row["delete"] == "1"

    class Meta:
        model = Book

如果在 'new' 实例上设置了删除标志(即该行在数据库中尚不存在),则该行将被跳过。

导出数据

现在我们已定义了一个:class:`~import_export.resources.ModelResource`类,我们可以导出书籍:

>>> from core.admin import BookResource
>>> dataset = BookResource().export()
>>> print(dataset.csv)
id,name,author,author_email,imported,published,price,categories
2,Some book,1,,0,2012-12-05,8.85,1

警告

以编程方式导出的数据不会对恶意内容进行清理。您需要理解其影响并相应处理。参见 安全