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

