Django无模型实例时如何获取Choice值对应的友好可读文本
Django无模型实例获取choices显示文本方法
Django本身提供了原生能力实现这个需求,不需要额外硬编码映射字典,也不会出现选项定义和映射不同步的问题。
通用兼容方案(推荐)
通过模型的_metaAPI获取目标字段实例,利用字段自带的平铺选项属性做查找,不管是普通二维元组格式的choices,还是带分组的optgroup格式choices都能正常工作:
from your_app.models import Review # 获取result字段的实例对象 result_field = Review._meta.get_field('result') # 字段内置的flatchoices是已经拍平的(存储值, 显示文本)元组列表,直接转字典即可查找 display_text = dict(result_field.flatchoices)['A'] # 上述代码返回结果为 'Approved'
简单场景快捷写法
如果你的choices是无分组的基础结构(和你贴出的Review模型定义一致),可以直接把类上定义的choices元组转成字典查找,写法更简洁:
display_text = dict(Review.RESULT_CHOICES)['D'] # 返回结果为 'Declined'
注意:该写法仅适配无分组的简单choices结构,如果后续给choices增加了选项分组,这个写法会直接失效,长期维护更推荐上面的通用方案。
不推荐硬编码字典的原因
单独维护一份值到显示文本的映射字典,相当于同一份选项逻辑写了两遍,后续调整choices取值、修改显示文本、增减选项时,很容易遗漏更新自定义字典,导致显示错误。使用Django内置属性读取的方式永远和模型定义保持同步,没有额外维护成本。
内容的提问来源于stack exchange,提问作者run_the_race
相关产品推荐
相关产品推荐

