Django中如何展示品牌列表及每个品牌下的关联汽车列表?
实现Django品牌列表及关联汽车展示的方案
嘿,我来帮你搞定这个Django视图的实现!你已经有了Brand和Car的模型,现在要做的就是在car_view里展示品牌列表,每个品牌下面列出对应的汽车,我给你一步步讲清楚怎么做:
1. 优化视图函数(避免N+1查询问题)
首先在views.py里修改你的car_view,我们要预取每个品牌关联的汽车,这样能减少数据库查询次数,提升性能:
from django.shortcuts import render from .models import Brand def car_view(request): # 使用prefetch_related预取关联的汽车集合,解决反向关联的N+1查询问题 brands = Brand.objects.all().prefetch_related('brands') return render(request, 'car_list.html', {'brands': brands})
这里要提个小建议:你原来的Car模型里,brand字段的related_name设为了'brands',这个命名有点容易混淆,改成'cars'会更直观,修改models.py里的Car模型:
class Car(models.Model): name = models.CharField(max_length=100) # 把related_name改成'cars',语义更清晰 brand = models.ForeignKey(Brand, related_name='cars', on_delete=models.CASCADE) def __str__(self): # 用f-string让代码更简洁 return f"{self.brand.name} - {self.name}"
如果改了related_name,视图里的prefetch_related也要对应改成'cars':
brands = Brand.objects.all().prefetch_related('cars')
2. 编写模板文件
接下来创建一个模板文件(比如templates/car_list.html),用来渲染品牌和汽车的列表:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>品牌与汽车列表</title> <style> .brand-section { margin: 20px 0; padding: 10px; border: 1px solid #eee; border-radius: 4px; } </style> </head> <body> <h1>品牌列表</h1> {% for brand in brands %} <div class="brand-section"> <h2>{{ brand.name }}</h2> <ul> {% if brand.cars.all %} {# 如果没改related_name就换成brand.brands.all #} {% for car in brand.cars.all %} <li>{{ car.name }}</li> {% endfor %} {% else %} <li>该品牌暂无汽车</li> {% endif %} </ul> </div> {% empty %} <p>暂无品牌数据</p> {% endfor %} </body> </html>
3. 配置URL路由
最后别忘了在你的应用urls.py里配置对应的路由,让用户能访问到这个视图:
from django.urls import path from .views import car_view urlpatterns = [ # 路径可以根据你的需求调整,比如'/cars/' path('cars/', car_view, name='car-list'), ]
这样访问对应的URL,就能看到每个品牌下面整齐列出它的所有汽车啦!
内容的提问来源于stack exchange,提问作者newObject
相关产品推荐
相关产品推荐

