Django中如何用values_list获取IntegerChoice的标签而非数值
解决Django中values_list获取IntegerChoices标签而非数值的问题
默认情况下,values_list()会直接返回gender字段存储的数值(1或2)。要获取对应的标签字符串(Male/Female),可以通过两种方式实现:
方法一:数据库层面注解(推荐,性能更优)
通过Django的数据库函数Case和When在查询时动态生成标签字段,适用于数据量较大的场景:
首先导入所需模块:
from django.db.models import Case, When, Value, CharField from .models import Policy
然后执行查询:
result = Policy.objects.annotate( gender_label=Case( When(gender=Policy.Gender.MALE, then=Value(Policy.Gender.MALE.label)), When(gender=Policy.Gender.FEMALE, then=Value(Policy.Gender.FEMALE.label)), default=Value(''), # 处理gender为null的情况 output_field=CharField() ) ).values_list("maca", "gender_label")
方法二:模型属性+Python层面处理
如果数据量不大,可以在模型中定义属性方法,再手动生成结果列表:
在Policy模型中添加属性:
class Policy(models.Model): # 原有代码不变 @property def gender_label(self): return self.get_gender_display() if self.gender else ''
然后在视图中处理:
result = [(obj.maca, obj.gender_label) for obj in Policy.objects.all()]
内容的提问来源于stack exchange,提问作者Korab Duklini
相关产品推荐
相关产品推荐

