Подтвердить что ты не робот

Экспорт импорта Django - Невозможно импортировать модель с BinaryField

Я пытаюсь импортировать данные из модели с BinaryField значением 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']
4b9b3361

Ответ 1

К сожалению, это, похоже, проблема с модулем django-import-export.

В Python 2. 7+ и 3.5. 2+, объекты травления 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

По-видимому, в строке 451 django-import-export (версия 0.6) BinaryField передается как объект memoryview для

original = deepcopy(instance)

который вызывает ошибку (instance содержит BinaryField в качестве объекта memoryview).
В текущей версии (1.0.0) это происходит в строке 446.

Экземпляр, полученный/сгенерированный модулем instance_loader модуля, не учитывает BinaryField.

Вероятно, вам стоит открыть билет на django-import-export.

Ответ 2

вы добавили binary_field в ABCModelForm? Если да, то это создает проблему, потому что невозможно включить BinaryField в ModelForm. Для справки: бинарное поле

Ответ 3

Возможно, передача фактического массива вместо представления памяти может решить вашу проблему. Если вы хотите выполнить функцию параллельно, все ее параметры должны быть выбраны, если я правильно назову. По крайней мере, это относится к многопроцессорности python. Таким образом, вы можете передать массив функции и создать memoryview внутри вашей функции.

ссылка: moreinfo