为什么在 django-import-export 中不起作用 use_bulk?

Why in django-import-export doesn't work use_bulk?

我使用 django-import-export 2.8.0Oracle 12c.
通过 import_data() 逐行导入没有问题,但是当我打开 use_bulk=True 选项时,它停止导入并且不会抛出任何错误。 为什么不起作用?

resources.py

class ClientsResources(resources.ModelResource):

    class Meta:
        model = Clients
        fields = ('id', 'name', 'surname', 'age', 'is_active')
        batch_size = 1000
        use_bulk = True
        raise_errors = True

views.py

def import_data(request):
    if request.method == 'POST':
        file_format = request.POST['file-format']
        new_employees = request.FILES['importData']

        clients_resource = ClientsResources()
        dataset = Dataset()

        imported_data = dataset.load(new_employees.read().decode('utf-8'), format=file_format)
        result = clients_resource.import_data(imported_data, dry_run=True, raise_errors=True)

        if not result.has_errors():
            clients_resource.import_data(imported_data, dry_run=False)

    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

data.csv

id,name,surname,age,is_active
18,XSXQAMA,BEHKZFI,89,Y
19,DYKNLVE,ZVYDVCX,20,Y
20,GPYXUQE,BCSRUSA,73,Y
21,EFHOGJJ,MXTWVST,93,Y
22,OGRCEEQ,KJZVQEG,52,Y

--UPD--

我使用了 django-debug-toolbar,发现导入查询有一个非常奇怪的行为。

管理面板不起作用。我see all importing rows, but next it writes "Import finished, with 5 new and 0 updated clients.", and see this strange queries

然后我使用 import by my form 和这里同时出现的情况:

use_bulk 来自 django-import-export (more)

为了比较我的句柄create_bulk()

--UPD2--

我尝试跟踪导入逻辑并查看发现的内容:

import_export/resources.py

   def bulk_create(self, using_transactions, dry_run, raise_errors, batch_size=None):
        """
        Creates objects by calling ``bulk_create``.
        """
        print(self.create_instances)
        try:
            if len(self.create_instances) > 0:
                if not using_transactions and dry_run:
                    pass
                else:
                    self._meta.model.objects.bulk_create(self.create_instances, batch_size=batch_size)
        except Exception as e:
            logger.exception(e)
            if raise_errors:
                raise e
        finally:
            self.create_instances.clear()

此 print() 显示空列表的值。

此问题似乎是由于 django-import-export 的 2.x 版本中的错误所致。它已在 v3 中修复。

  • 当 运行 在批量模式下 (use_bulk=True)
  • 时存在错误
  • save_instance() 中的逻辑是发现 'new' 个实例设置了 pk 个值,然后错误地将它们视为更新,而不是创建。
  • 我无法确定这将如何发生。这可能与使用 Oracle 有关(虽然我看不出如何)。