Django插入越南语JSON选项报malformed array literal错误如何解决
错误原因排查
你的报错是PostgreSQL将传入的数据识别为非法数组格式,核心原因如下:
你之前将choices字段定义为ArrayField时已经生成过数据库迁移,后续改为JSONField后没有重新生成并执行迁移,数据库表的字段类型仍为数组类型,因此传入JSON对象会报格式错误。
Django原生JSONField对UTF-8字符(包括越南语)完全兼容,不存在编码不支持的问题。
现有JSONField方案修复步骤
- 删除app/migrations目录下除
__init__.py之外的所有历史迁移文件 - 重新生成迁移:
python manage.py makemigrations - 执行迁移更新数据库字段:
python manage.py migrate
完成后即可正常存储带越南语的JSON格式选项,不需要额外修改代码逻辑。
用ArrayField替代JSONField的实现方案
可以用ArrayField,但仅支持PostgreSQL数据库,且需要调整数据结构,示例如下:
1. 修改models.py字段定义
from django.contrib.postgres.fields import ArrayField class Question(models.Model): title = models.TextField(null=False, blank=False) description = models.TextField(null=False, blank=True) category = models.ForeignKey(Category, on_delete=models.CASCADE) # 每个选项为包含key和文本的对象,适配多选题选项结构 choices = ArrayField( models.JSONField(), null=False, blank=False ) answer = models.TextField(null=False,blank=False) level = models.IntegerField(null=True, blank=True)
2. 调整POST请求参数格式
{ "title": "Hôm năy ăn gì", "category": 3, "choices": [ {"key": "A", "text": "Cơm"}, {"key": "B", "text": "cháo"} ], "answer": "A" }
3. 重新执行迁移
修改模型后重新运行makemigrations和migrate命令更新数据库结构即可。
注意:ArrayField是PostgreSQL专属字段,MySQL、SQLite等其他数据库不支持该类型。
内容的提问来源于stack exchange,提问作者MadTik
相关产品推荐
相关产品推荐

