Django models.TextChoices添加额外字段时__new__参数错误排查
Django TextChoices扩展额外字段的参数错误解决
问题详情
- 报错:
TypeError: MyPets.FleaPlans.__new__() missing 1 required positional argument: 'label' - 需求:将默认仅支持
value、label参数的TextChoices,扩展为支持value、desc、label三个参数 - 异常现象:只要用三个参数定义选项就触发错误,用两个参数则正常,可通过Django Shell复现
错误原因
你错误地将重写的__new__方法定义在了外层的MyPets模型类中,而非内部的FleaPlans(TextChoices子类)里,导致参数传递逻辑完全偏离预期。
参考示例代码
官方风格的TextChoices扩展示例:
from django.db import models class ColorChoices(models.TextChoices): def __new__(cls, value, label, hex_code): obj = str.__new__(cls, value) obj._value_ = value obj.label = label obj.hex_code = hex_code return obj RED = 'R', 'Red', '#FF0000'
修正后的代码
将__new__方法移至FleaPlans内部,并正确处理三个参数:
from django.db import models class MyPets(models.Model): class FleaPlans(models.TextChoices): def __new__(cls, value, desc, label): obj = str.__new__(cls, value) obj._value_ = value obj.label = label obj.desc = desc return obj REVOLUTION = ('REV','Revolution - Monthly treatment/ every 31 days','Revolution') NONE = ('NON','No Treatment plan selected','None')
关键修正点
- 把
__new__方法放在FleaPlans类内部,确保每个选项实例化时调用该方法处理参数 - 使用Django TextChoices规范的
label属性(而非自定义的_label_) - 将传入的
desc参数正确赋值给实例的desc字段,而非硬编码固定字符串
内容的提问来源于stack exchange,提问作者user5744
相关产品推荐
相关产品推荐

