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

如何将Django TextChoices的文本映射为对应枚举选项?

问题描述

我参考Django文档编写了如下TextChoices枚举类:

class YearInSchool(models.TextChoices):
    FRESHMAN = 'FR', 'Freshman'
    SOPHOMORE = 'SO', 'Sophomore'
    JUNIOR = 'JR', 'Junior'
    SENIOR = 'SR', 'Senior'
    GRADUATE = 'GR', 'Graduate'

现在我有字符串"Sophomore",想要获取对应的YearInSchool.SOPHOMORE枚举值。目前用循环遍历的方式实现:

the_str = "Sophomore"
val = None
for val1, label in YearInSchool.choices:
    if label == the_str:
        val = YearInSchool(val1)
        break

assert YearInSchool.SOPHOMORE == val

但这种方法比较繁琐,想知道有没有更优的实现方式?

补充说明:我需要将外部文本文件中的数据导入数据库,文本中的内容是预先给定的,希望通过TextChoices将这些文本与数据库字段关联。

更优实现方式

Django的TextChoices(及其父类Choices)内部维护了_label2member_map_属性——这是一个标签到枚举成员的直接映射字典,无需手动循环就能通过标签字符串获取对应枚举值:

the_str = "Sophomore"
val = YearInSchool._label2member_map_[the_str]

assert YearInSchool.SOPHOMORE == val

如果要处理文本中可能存在的非法标签(避免抛出KeyError),可以用字典的get方法做容错处理:

val = YearInSchool._label2member_map_.get(the_str)
# 后续可通过判断val是否为None来做异常分支处理

要是你需要直接获取数据库存储用的键值,还可以通过枚举成员的value属性拿到:

db_value = YearInSchool._label2member_map_[the_str].value
# 此时db_value为'SO',可直接存入对应模型字段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:39:27