如何在使用 Django import_export 的 import_data 方法时提供 "result.has_errors()" 和 "result.has_validation_errors()" 属性

How to provide the "result.has_errors()" and "result.has_validation_errors()" attributes when using import_data method for Django import_export

我需要更改使用 Django 模块 import_Export 导入的 csv 文件。我为此实现了 import_data 方法,但出现错误 'Dataset' object has no attribute 'has_errors'

    Traceback (most recent call last):
  File "C:\Program Files\Python36\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Program Files\Python36\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Program Files\Python36\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Program Files\Python36\lib\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Program Files\Python36\lib\site-packages\django\views\decorators\cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "C:\Program Files\Python36\lib\site-packages\django\contrib\admin\sites.py", line 231, in inner
    return view(request, *args, **kwargs)
  File "C:\Program Files\Python36\lib\site-packages\import_export\admin.py", line 316, in import_action
    if not result.has_errors() and not result.has_validation_errors():

Exception Type: AttributeError at /admin/engine/mtg/import/
Exception Value: 'Dataset' object has no attribute 'has_errors'

当我 return 我的自定义数据集时,如何提供 result.has_error()result.has_validation_errors() 以避免此错误?这是我实现方法的地方

Admin

    class ModelResource(resources.ModelResource):

    def import_data(self, dataset, dry_run=False, raise_errors=True,use_transactions=None, collect_failed_rows=False, **kwargs):
        new_dataset = do_stuff(dataset)
        return new_dataset

文档指出 import_data 方法所做的第一件事是创建一个包含错误信息的“结果”实例。我假设这可能是我需要的?但我不知道如何使用我的新数据集[导入数据工作流程][1]

或 return 访问它

[1]: https://django-import-export.readthedocs.io/en/latest/import_workflow.html?highlight=before)导入

您不需要覆盖 has_errors()has_validation_errors(),因为应该为您处理逻辑。

通常你不应该覆盖 import_data() 因为这是导入逻辑发生的地方。将有效的 Dataset 对象作为第一个参数传递给 import_data()。我建议快速浏览一下 source,因为这会弄清楚发生了什么。

如果您需要修改导入的数据,可以使用几个挂钩。这是您对基础资源进行子类化并添加您自己的逻辑的地方。

本例基于django-import-export example app:

class BookResource(resources.ModelResource):
    
    def before_import_row(self, row, row_number=None, **kwargs):
        """
        Override to add additional logic.
        """
        pass

    def before_save_instance(self, instance, using_transactions, dry_run):
        """
        Override to add additional logic.
        """
        pass

    class Meta:
        model = Book
        fields = ('id', 'author_email', 'price')

然后你可以这样调用:

    rows = [
        ('book1', 'email@example.com', '10.25'),
        ('book2', 'email@example.com', '10.25'),
        ('book1', 'email@example.com', '10.25'),
    ]
    dataset = tablib.Dataset(*rows, headers=['name', 'author_email', 'price'])

    book_resource = BookResource()
    result = book_resource.import_data(dataset)
    print(result.totals)