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

Django添加带choices字段报错,请求解决fields.E005错误

解决Django模型choices字段报错问题

错误原因

你编写的代码中,SUBJECTS_TEACHER_CHOICES使用了字典类型,但Django的choices参数要求必须是包含(实际存储值, 人类可读名称)元组的可迭代对象(比如列表、元组),字典不符合该格式,因此触发fields.E005错误。

修复方案

方案一:改用元组的元组(推荐)

这是Django官方推荐的写法,结构清晰且能保证选项顺序固定:

from django.db import models

class Teacher(models.Model):
    MATH = 'MT'
    PHYS = 'PH'
    COMP = 'CS'
    # 定义为元组的元组,每个元素是(实际值, 可读名称)
    SUBJECTS_TEACHER_CHOICES = (
        (MATH, 'Math'),
        (PHYS, 'Phys'),
        (COMP, 'Comp'),
    )
    subjects = models.CharField(
        max_length=2,
        choices=SUBJECTS_TEACHER_CHOICES,
        default=MATH,
    )
    first_name = models.CharField(max_length=128)

方案二:基于字典转换(兼容写法)

如果想保留字典的键值对结构,可以将字典转为包含元组的列表后传递给choices:

from django.db import models

class Teacher(models.Model):
    MATH = 'MT'
    PHYS = 'PH'
    COMP = 'CS'
    SUBJECTS_TEACHER_CHOICES = {
        MATH: 'Math',
        PHYS: 'Phys',
        COMP: 'Comp',
    }
    subjects = models.CharField(
        max_length=2,
        # 将字典转为元组列表
        choices=list(SUBJECTS_TEACHER_CHOICES.items()),
        default=MATH,
    )
    first_name = models.CharField(max_length=128)

注意事项

  • 优先选择方案一,因为元组是不可变类型,更适合作为配置常量,且能保证选项顺序与定义一致;
  • 若使用方案二,Python 3.7之前的字典是无序的,可能导致选项顺序不符合预期,需留意Python版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:47:41