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

Django插入越南语JSON选项报malformed array literal错误如何解决

错误原因排查

你的报错是PostgreSQL将传入的数据识别为非法数组格式,核心原因如下:
你之前将choices字段定义为ArrayField时已经生成过数据库迁移,后续改为JSONField后没有重新生成并执行迁移,数据库表的字段类型仍为数组类型,因此传入JSON对象会报格式错误。

Django原生JSONField对UTF-8字符(包括越南语)完全兼容,不存在编码不支持的问题。

现有JSONField方案修复步骤

  1. 删除app/migrations目录下除__init__.py之外的所有历史迁移文件
  2. 重新生成迁移:python manage.py makemigrations
  3. 执行迁移更新数据库字段: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:06:03