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

时间:2017-12-19 09:56:24

标签: python django django-import-export

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

我从相应fields对象中的Resource白名单中删除了该字段,并将其添加到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']

3 个答案:

答案 0 :(得分:1)

可悲的是,这似乎是django-import-export模块的问题。

在Python 2.7+和3.5.2+中,允许使用pickle 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打开一张关于此的门票。

答案 1 :(得分:0)

您是否在binary_field中添加了ABCModelForm?如果是,那么它正在创建问题,因为无法在ModelForm中包含BinaryField。供参考:binaryfield

答案 2 :(得分:0)

也许传递实际数组而不是内存视图可以解决您的问题。如果你想并行执行一个函数,如果我没记错的话,所有参数都必须是可选的。至少python多处理就是这种情况。因此,您可以将数组传递给函数并在函数内创建memoryview。

参考:moreinfo