Django中如何获取ChoiceField父选项组的名称?
问题:获取Django模型分组选项的父组名称
我在Django的Field模型中实现了一组带分组的选项,代码如下:
CULTIVATIONS = [ ('Apples', ( ('willow', 'Willow'), ('devil', 'Devil'), )), ('Cherries', ( ('samba', 'Samba'), ('rita', 'Rita'), )), ('Peaches', ( ('zodiac', 'Zodiac'), ('astoria', 'Astoria'), )), ('Nectarines', ( ('patagonia', 'Patagonia'), ('garcima', 'Garcima'), )), ] class Field(models.Model): class Meta: verbose_name_plural = "Fields" ... cultivation = models.CharField(max_length=128, choices=CULTIVATIONS, blank=True)
我可以通过field.cultivation访问Field模型实例的cultivation字段值,但如何获取该值所属的父选项组名称?例如当值为willow时,如何得到对应的Apples?
解决方案
方法一:编写辅助函数
写一个通用函数遍历分组选项列表,匹配目标值后返回对应组名:
def get_cultivation_group(value): for group_name, options in CULTIVATIONS: for opt_value, opt_label in options: if opt_value == value: return group_name return None # 无匹配值时返回None
使用示例:
field_instance = Field.objects.get(id=1) group_name = get_cultivation_group(field_instance.cultivation) # 当field_instance.cultivation为'willow'时,group_name返回'Apples'
方法二:在模型中添加实例方法
直接在Field模型内定义方法,方便实例直接调用:
class Field(models.Model): # 原有代码... cultivation = models.CharField(max_length=128, choices=CULTIVATIONS, blank=True) def get_cultivation_group(self): if not self.cultivation: return None for group_name, options in CULTIVATIONS: for opt_value, _ in options: if opt_value == self.cultivation: return group_name return None
使用示例:
field_instance = Field.objects.get(id=1) group_name = field_instance.get_cultivation_group()
方法三:预生成映射字典
若需频繁查询,可提前生成值到组名的映射字典,提升查询效率:
# 预生成映射关系 CULTIVATION_TO_GROUP = {} for group_name, options in CULTIVATIONS: for opt_value, _ in options: CULTIVATION_TO_GROUP[opt_value] = group_name # 使用时直接通过字典取值 group_name = CULTIVATION_TO_GROUP.get(field_instance.cultivation)
内容的提问来源于stack exchange,提问作者haduki
相关产品推荐
相关产品推荐

