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

Django模板中如何正确使用反向关联获取关联字段值

问题原因

Order与OrderItem是一对多关联:1个订单可以对应多条订单项记录,因此order.orderitem_set是Django反向关联生成的管理器对象,直接调用返回的是多条OrderItem实例组成的集合(QuerySet),不是单个订单项对象,自然无法直接通过.product.unit_price链式读取属性,这就是字段无法正常渲染的核心原因。
另外注意:模板中访问一对多反向关联的所有对象时,必须在管理器后加.all(),否则拿到的只是管理器实例,不会返回实际数据。

正确写法

根据业务需求分两种场景处理:

场景1:展示订单下所有商品的单价

这是最常见的场景,需要在订单循环内嵌套一层循环,遍历当前订单关联的所有订单项,再读取对应商品的单价:

{% for order in orders %}
<li>
  {{ order.customer.last_name }}
  <ul>
    {% for item in order.orderitem_set.all %}
    <li>商品单价:{{ item.product.unit_price }}</li>
    {% endfor %}
  </ul>
</li>
{% endfor %}
  • 注意区分两个单价字段:OrderItem表自带的unit_price是用户下单时锁定的成交单价,不会随商品后续改价变化;item.product.unit_price是商品表的当前实时单价,根据业务需求选择即可。

场景2:仅展示订单下某一个特定商品的单价

如果只需要取指定条件的订单项单价,可以在反向关联后加过滤逻辑匹配对应记录,再取值:

{% for order in orders %}
<li>
  {{ order.customer.last_name }} - 
  <!-- 示例:取id为1的商品在该订单中的单价 -->
  {{ order.orderitem_set.filter(product_id=1).first.product.unit_price }}
</li>
{% endfor %}
性能优化建议

如果订单量较大,模板中直接遍历反向关联会触发N+1查询问题(每循环一个订单就额外查一次订单项表、商品表),建议在视图层查询订单数据时提前预加载关联数据,大幅减少数据库查询次数:

# 视图层查询代码示例
def order_list(request):
    orders = Order.objects.prefetch_related('orderitem_set__product').all()
    return render(request, '订单列表模板路径.html', {'orders': orders})

内容的提问来源于stack exchange,提问作者Davit Sahakyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:06:17