如果 JSON 列表为空,则导入导出的列表 JSONField 将 JSON 转换为字符串

importing an exported list JSONField turns JSON to string if JSON list is empty

我正在使用来自类似问题的 answer。但我想将导入导出文件中的任何空字段视为空列表而不是 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)

当我尝试导出它时,它没有显示任何内容。当我尝试导入并进行一些操作时,它 returns 是一个异常。

'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 中,您将在该字段中得到 [],如果愿意,您可以将代码调整为 return 空字符串,然后导入/导出将作为预期。