python - Django 导入导出 - 无法使用 BinaryField 导入模型

标签 python django django-import-export

我正在尝试从具有可为空的 BinaryField 的模型中导入数据。数据不包含该字段,我希望它在字段中导入空值。如果给定 id 的字段已经存在于数据库中,它应该保持原值。

我将该字段从对应的Resource对象中的fields白名单中移除,加入到exclude黑名单中。但是,我在导入时遇到此错误 - can't pickle memoryview objects

回溯:

Traceback (most recent call last):
File "/lib/python3.5/site-packages/import_export/resources.py", line 451, in import_row
original = deepcopy(instance)
File "/lib/python3.5/copy.py", line 182, in deepcopy
y = _reconstruct(x, rv, 1, memo)
File "/lib/python3.5/copy.py", line 297, in _reconstruct
state = deepcopy(state, memo)
File "/lib/python3.5/copy.py", line 155, in deepcopy
y = copier(x, memo)
File "/lib/python3.5/copy.py", line 243, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/lib/python3.5/copy.py", line 174, in deepcopy
rv = reductor(4)
TypeError: can't pickle memoryview objects

包版本 - django==1.11, django-import-export==0.6

编辑:

class ABC(models.Model):
    name = models.CharField('Name', max_length=128, blank=False, null=False)
    binary_field = models.BinaryField('Some name', null=True, blank=True)

class ABCResource(resources.ModelResource):
    class Meta:
        model = ABC
        fields = (
            'id',
            'name',
        )
        import_id_fields = ('id',)
        exclude = ('binary_field',)

class ABCAdmin(ImportExportModelAdmin):
    form = ABCModelForm
    list_display = (
        'id',
        'name',
    )
    exclude = ('binary_field',)
    resource_class = ABCResource

class ABCModelForm(forms.ModelForm):
    class Meta:
        model = ABC
        exclude = ['binary_field']

最佳答案

遗憾的是,这似乎是 django-import-export 的问题模块。

在 Python 2.7+ 和 3.5.2+ 中,允许 pickling memoryview 对象。尝试以下代码只是为了确认:

import pickle

test = memoryview(b'abc')
test.__reduce__()

以上将引发以下错误:

Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "/usr/lib/python2.7/copy_reg.py", line 70, in _reduce_ex
    raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle memoryview objects

显然,在 django-import-export(版本 0.6)的第 451 行中,BinaryField 作为 memoryview 对象传递给

original = deepcopy(instance)

导致错误的原因(instance 包含 BinaryField 作为 memoryview 对象)。
在当前版本 (1.0.0) 中,这发生在 446 行.

instance_loader 检索/生成的实例该模块没有考虑 BinaryField

您可能应该在 django-import-export 开一张票关于这个。

关于python - Django 导入导出 - 无法使用 BinaryField 导入模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47884283/

相关文章:

python - 获取 session 信息并放入 django 表单中

python - 一起使用 django-datatrans 和 django-markitup 时出现 AttributeError

python - 导出按钮在 django-import-export 包中不可见

django-import-export 分配当前用户

python - 扩展 django-import-export 的导入表单以指定每个导入行的固定值

python - 通过在 python 中的相似性进行图像聚类

python - 中间有负载均衡器时如何跟踪浏览器的IP

python - 如何在自己的线程中扭曲运行并正确停止?

python - 在 Pandas 中,每个用户只需要获取特定数量的日期

python - 在自定义用户的配置文件中发现不需要的随机值