入门¶
介绍¶
本节介绍如何开始使用导入-导出功能。我们将以: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。
在第五行中,创建了一个带有列 id 和 name 的 Dataset 以及一个书籍条目。始终需要存在一个唯一标识实例的字段(或字段组合)。这是为了导入过程可以管理创建/更新。在本例中,我们使用 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
警告
以编程方式导出的数据不会对恶意内容进行清理。您需要理解其影响并相应处理。参见 安全。