You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:30:02