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

Django ArrayField绑定常量类choices报fields.E005错误如何解决?

问题原因

出现该错误的核心原因有两个:

  • Django对ArrayField内部base字段的choices参数校验存在兼容缺陷,当choices返回值包含gettext懒翻译对象时,校验逻辑会误判元组格式不符合要求
  • 按照Django的设计规范,ArrayField的可选值约束应该直接定义在ArrayField本身的参数上,而非内部嵌套的base字段
解决方法

方案1(推荐,90%以上场景可直接解决)

把choices参数从内部的CharField移到ArrayField的参数中,修改后模型代码如下:

from django.contrib.postgres.fields import ArrayField
from apps.users.constants import LanguageChoices

class Data(models.Model):
    language = ArrayField(
        models.CharField(max_length=30), 
        choices=LanguageChoices.choices(),
        blank=True, 
        null=True
    )

方案2(适配翻译对象校验问题)

如果调整choices位置后仍然报错,说明校验逻辑识别不了懒翻译对象,需要修改常量类的choices方法,把翻译结果转为普通字符串:

from django.utils.encoding import force_str
from django.utils.translation import gettext as _

class LanguageChoices:
    EN = "English"
    FR = "French"

    @classmethod
    def choices(cls):
        return (
            (cls.EN, force_str(_("English"))),
            (cls.FR, force_str(_("French"))),
        )

方案3(更规范的选项定义)

如果使用Django 3.0及以上版本,直接用官方内置的TextChoices类定义选项,避免手写choices方法带来的兼容问题:

# 常量文件代码
from django.db import models
from django.utils.translation import gettext_lazy as _

class LanguageChoices(models.TextChoices):
    EN = "English", _("English")
    FR = "French", _("French")
# 模型代码
from django.contrib.postgres.fields import ArrayField
from apps.users.constants import LanguageChoices

class Data(models.Model):
    language = ArrayField(
        models.CharField(max_length=30), 
        choices=LanguageChoices.choices,
        blank=True, 
        null=True
    )

修改完成后先执行python manage.py check确认系统校验通过,再运行迁移即可。

内容的提问来源于stack exchange,提问作者andrepz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:09:02