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

