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
相关产品推荐
相关产品推荐

