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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 02:27:28