如何在Django模板中解析注解获取的POD返回状态文本值
解决方案
方法一:在注解中直接生成状态文本
通过Case和When将数字状态码直接映射为对应文本,一次性查询出可直接展示的内容,无需后续处理:
from django.db.models import Case, When, Value, CharField, Subquery, OuterRef invoices = vendor.invoices.order_by('-due_date').annotate( pod_return_status_display=Case( # 遍历Booking的状态选项,生成对应的条件映射 *[When(pod_return_status=code, then=Value(label)) for code, label in Booking.POD_RETURN_STATUS], output_field=CharField(), default=Value('未知状态') # 处理未匹配到的异常状态 ), # 可选:保留数字状态用于其他逻辑 pod_return_status=Subquery( Booking.objects.filter(vendor_invoice=OuterRef('pk')).values('pod_return_status')[:1] ) )
模板中直接调用注解好的字段:
{{ invoice.pod_return_status_display }}
方法二:将状态选项转为字典传入模板
Django的choices是元组列表,无法直接通过索引取值,需先转为字典再传入上下文:
视图代码
# 将choices转为字典 context['POD_STATUS_DICT'] = dict(Booking.POD_RETURN_STATUS) # 保留原有的annotate查询 invoices = vendor.invoices.order_by('-due_date').annotate( pod_return_status=Subquery( Booking.objects.filter(vendor_invoice=OuterRef('pk')).values('pod_return_status')[:1] ) ) context['invoices'] = invoices
模板代码
{{ POD_STATUS_DICT[invoice.pod_return_status] }}
方法三:优化prefetch_related查询
如果之前用prefetch_related未生效,可能是未指定查询范围和字段,可通过Prefetch对象精准控制预加载内容:
from django.db.models import Prefetch # 预加载每个invoice的第一条booking,只取需要的状态字段 invoices = vendor.invoices.order_by('-due_date').prefetch_related( Prefetch( 'bookings', queryset=Booking.objects.only('pod_return_status')[:1], to_attr='first_booking' # 将结果存入自定义属性,避免和原bookings查询冲突 ) )
模板中通过自定义属性调用显示方法:
{{ invoice.first_booking.0.get_pod_return_status_display }}
内容的提问来源于stack exchange,提问作者Andi Fathul Mukminin
相关产品推荐
相关产品推荐

