Импортирование экспортированного списка 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, вы получите [] в поле, вы можете настроить код на возврат пустой строки, если хотите, тогда импорт / экспорт будет работать как ожидалось.

Вернуться на верх