导入已导出的空JSONField列表时JSON被转为字符串如何解决
问题根因
两个异常均由JSONWidget默认空值处理逻辑导致:
- 导出时,空列表/None值会被序列化为空白内容,无任何展示
- 导入时,空字段会被解析为字符串类型的空值,直接覆盖模型的
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.
相关产品推荐
相关产品推荐

