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
相关产品推荐
相关产品推荐

