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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:26:18