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 }}   power: {{ product.power }}W   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
相关产品推荐
相关产品推荐

