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

如何在Django中实现一个choices类继承多个choices类?

解决Django TextChoices多继承报错的问题

首先明确报错原因:Django的TextChoices底层基于Python的Enum,而Python的枚举类型不允许同时从多个具体的枚举类继承,所以直接写class C(C1, C2): pass会触发TypeError。

以下是几种可行的实现方式:

方法1:手动复制选项

直接在新的TextChoices类中导入原有类的选项,适合选项较少的场景:

from django.db import models

class C(models.TextChoices):
    attr1 = C1.attr1
    attr2 = C1.attr2
    attr3 = C2.attr3
    attr4 = C2.attr4

方法2:动态合并选项

利用枚举类的__members__属性批量导入选项,避免手动复制的繁琐:

from django.db import models

class C(models.TextChoices):
    pass

# 导入C1的所有选项
for name, member in C1.__members__.items():
    setattr(C, name, member)

# 导入C2的所有选项
for name, member in C2.__members__.items():
    setattr(C, name, member)

方法3:封装工具函数复用

如果需要频繁合并多个TextChoices,可以封装一个工具函数,提升复用性:

from django.db import models

def merge_text_choices(*choices_classes):
    # 创建空的TextChoices子类
    merged_class = type('MergedTextChoices', (models.TextChoices,), {})
    # 遍历所有待合并的类,导入选项
    for cls in choices_classes:
        for name, member in cls.__members__.items():
            setattr(merged_class, name, member)
    return merged_class

# 使用示例
C = merge_text_choices(C1, C2)

以上三种方法都能实现将C1和C2的选项合并到新的类C中,且完全符合DjangoTextChoices的使用规范,后续可以直接在模型字段中使用C.choices。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:30:42