You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导入已导出的空JSONField列表时JSON被转为字符串如何解决

问题根因

两个异常均由JSONWidget默认空值处理逻辑导致:

  1. 导出时,空列表/None值会被序列化为空白内容,无任何展示
  2. 导入时,空字段会被解析为字符串类型的空值,直接覆盖模型的default=list配置,调用列表方法时触发属性异常

解决方案

步骤1:自定义支持空列表的JSONWidget

重写组件的导出渲染、导入清洗逻辑,统一把空值处理为[]:

from import_export.widgets import JSONWidget
import json

class EmptyListJSONWidget(JSONWidget):
    # 导出时空值输出为[]
    def render(self, value, obj=None):
        if value is None or not value:
            return json.dumps([])
        return super().render(value, obj)
    
    # 导入时空值转为空列表
    def clean(self, value, row=None, *args, **kwargs):
        if not value or str(value).strip() == '':
            return []
        return super().clean(value, row, *args, **kwargs)

步骤2:更新资源字段配置

把原字段的默认JSONWidget替换为自定义组件即可:

some_list_json= fields.Field(
    attribute='some_list_json', 
    widget=EmptyListJSONWidget(), 
    column_name='some_list_json',
    blank=True
)

可选优化:调整模型字段

由于导入导出层已经统一将空值转为空列表,建议把模型字段的null=True改为null=False,避免数据库出现None值,进一步降低异常风险:

some_list_json = models.JSONField(default=list, blank=True, null=False)

效果验证

  • 导出:空列表字段会正常显示[],不再空白
  • 导入:空字段自动识别为空列表,调用append等列表方法不会抛出属性异常

内容的提问来源于stack exchange,提问作者Prosy A.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:54:04