Импортирование экспортированного списка JSONField превращает JSON в строку, если список JSON пуст
Я использую этот ответ из аналогичного вопроса. Но я хотел бы обрабатывать любые пустые поля из файла импорта-экспорта как пустой список вместо None.
У меня есть этот ресурс:
some_list_json= fields.Field(attribute='some_list_json',
widget=JSONWidget(),
column_name='some_list_json')
С этим полем:
some_list_json = models.JSONField(default=list, blank=True, null=True)
Когда я пытаюсь экспортировать его, он ничего не показывает. А когда я пытаюсь импортировать и выполнить некоторые манипуляции, возвращается исключение.
'str' object has no attribute 'append'
Как мне обойти это?
Вы можете переопределить JSONWidget
для обработки этого случая:
class EmptyListJSONWidget(JSONWidget):
def clean(self, value, row=None, *args, **kwargs):
val = super().clean(value)
if not val:
return list()
return val
def render(self, value, obj=None):
if value is []:
return value
return json.dumps(value)
Не забудьте обновить поле ресурса, чтобы оно ссылалось на этот новый виджет вместо JSONWidget
.
Обратите внимание, что при экспорте в csv, вы получите []
в поле, вы можете настроить код на возврат пустой строки, если хотите, тогда импорт / экспорт будет работать как ожидалось.