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

Django模板如何正确展示一对一关联双模型的列表数据

问题根源

代码无法正确展示价格,核心有两个错误:

  • 视图层单独查询全量Price数据传给模板,传入的prices是所有价格记录的查询集合,不是和当前遍历产品绑定的单个价格对象
  • 模板层试图从全量价格查询集上取prices.product.price,查询集本身没有product属性,无法匹配到当前循环产品对应的价格

Django 对OneToOneField关联默认实现了反向属性映射,不需要单独查询全量价格数据再手动匹配。

调整方案

视图代码修改

不需要单独查询Price表,直接查询Product数据即可,建议加select_related预加载关联价格数据,避免循环渲染时产生多次数据库查询,提升性能:

def index(request):
    # select_related 会通过联表一次性查出产品和对应的价格数据
    products = Product.objects.select_related('price').all()
    return render(request, "index.html", {'list_of_products': products})

模板代码修改

遍历产品时,直接通过Django自动生成的反向关联属性price,拿到当前产品绑定的价格对象即可,同时兼容部分产品未绑定价格的异常场景:

<h2>List of Products</h2>
<ul>
    {% for product in list_of_products %}
        <li>
            product: {{ product.name }}
            &emsp;&emsp;power: {{ product.power }}W
            &emsp; price: ${{ product.price.price|default:"0" }}
        </li>
    {% endfor %}
</ul>

代码说明:

  • product.price是OneToOne关联自动生成的反向访问属性,对应和当前产品绑定的Price模型实例
  • 后续的.price是Price模型中存储具体金额的字段
  • |default:"0"是模板过滤器,当产品没有绑定对应价格记录时,默认显示0,避免抛出DoesNotExist渲染异常
关联逻辑说明

模型定义中,Price通过OneToOneField关联到Product并作为自身主键:

  • 正向查询(从价格找对应产品):通过price_instance.product访问关联的产品对象
  • 反向查询(从产品找对应价格):通过product_instance.price访问关联的价格对象,这个属性是Django ORM自动生成的,不需要额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 10:24:14