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

Django无需拆分模型,基于单表实现依赖下拉菜单可行吗?

直接基于现有Car_list表实现依赖下拉菜单的方案

完全可以不用拆分模型,通过后端提供动态数据接口+前端JS监听联动的方式实现依赖下拉,以下是具体实现步骤:

1. 后端实现动态数据接口

先写一个视图,根据传入的品牌参数,从现有Car_list表中查询对应的车型分类(去重):

# views.py
from django.http import JsonResponse
from .models import Car_list

def get_model_cats(request):
    car_brand = request.GET.get('brand')
    if car_brand:
        # 查询该品牌下所有不重复的车型分类,按名称排序
        model_cats = (
            Car_list.objects.filter(car_brand=car_brand)
            .values_list('car_model_cat', flat=True)
            .distinct()
            .order_by('car_model_cat')
        )
        return JsonResponse(list(model_cats), safe=False)
    return JsonResponse([], safe=False)

然后在urls.py中配置该接口的路由:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    # 其他已有路由
    path('get-model-cats/', views.get_model_cats, name='get_model_cats'),
]

2. 前端页面实现联动(普通表单场景)

在表单页面中,通过JS监听品牌下拉框的变化,调用接口更新车型分类下拉选项:

<!-- 品牌下拉框 -->
<select id="car-brand">
    {% for brand in car_brands %}
        <option value="{{ brand }}">{{ brand }}</option>
    {% endfor %}
</select>

<!-- 车型分类下拉框 -->
<select id="car-model-cat">
    <option value="">请先选择品牌</option>
</select>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
    $('#car-brand').change(function() {
        const selectedBrand = $(this).val();
        const modelCatSelect = $('#car-model-cat');
        
        // 清空下拉框并显示加载状态
        modelCatSelect.empty().append('<option value="">加载中...</option>');
        
        // 请求后端接口获取数据
        $.ajax({
            url: "{% url 'get_model_cats' %}",
            data: { brand: selectedBrand },
            success: function(data) {
                modelCatSelect.empty().append('<option value="">请选择车型分类</option>');
                // 遍历数据生成选项
                data.forEach(cat => {
                    modelCatSelect.append(`<option value="${cat}">${cat}</option>`);
                });
            },
            error: function() {
                modelCatSelect.empty().append('<option value="">加载失败,请重试</option>');
            }
        });
    });
});
</script>

3. Django Admin页面适配

如果要在Admin后台实现联动,需要自定义Admin表单并引入JS:

# admin.py
from django.contrib import admin
from .models import Car_list
from django import forms

class CarListForm(forms.ModelForm):
    class Meta:
        model = Car_list
        fields = '__all__'

    # 引入JS文件,也可以直接写内联JS
    class Media:
        js = (
            'https://code.jquery.com/jquery-3.6.0.min.js',
            'js/car_admin_dropdown.js',  # 放在static/js目录下
        )

class CarListAdmin(admin.ModelAdmin):
    form = CarListForm
    # 其他Admin配置(如list_display等)

admin.site.register(Car_list, CarListAdmin)

然后在static/js/car_admin_dropdown.js中编写联动逻辑:

jQuery(document).ready(function($) {
    // 监听Admin页面的品牌下拉框(ID为id_car_brand)
    $('#id_car_brand').change(function() {
        const brand = $(this).val();
        const modelCatSelect = $('#id_car_model_cat');
        
        modelCatSelect.empty().append('<option value="">加载中...</option>');
        
        $.getJSON('/get-model-cats/', { brand: brand }, function(data) {
            modelCatSelect.empty().append('<option value="">请选择车型分类</option>');
            data.forEach(cat => {
                modelCatSelect.append(`<option value="${cat}">${cat}</option>`);
            });
        });
    });
});

性能优化建议

  • 给car_brand字段添加数据库索引,加速查询:
    修改模型字段后执行迁移:
    car_brand = models.CharField(max_length=20, db_index=True)
    
  • 若数据量极大,可将品牌-车型分类的映射关系缓存到Redis等缓存工具中,接口直接读取缓存,减少数据库查询压力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:29:53