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

Django中如何基于外键关联日期字段过滤两个日期区间的数据

现有代码问题梳理

  • HTML模板错误:下拉选项的value值错误绑定了Car.CarID,且car变量不在当前循环作用域内,后端拿到的参数完全不符合过滤需求
  • 过滤逻辑错误:
    1. mfdate是关联ManufacturingYM的外键,要过滤关联表的ManufacturingDate字段,需要用Django的跨表查询语法__(双下划线)
    2. 现有逻辑是分别过滤日期等于起始/结束值,没有实现范围查询,且两次独立赋值查询集会覆盖前一次的结果,无法实现双条件同时生效
  • 参数处理错误:无意义的参数转字符串操作,也没有适配日期/年份的查询逻辑

修复代码

1. 修复home.html的下拉选项

你当前下拉显示的是年份,直接把value绑定为年份值即可:

<form method="post" id="indexForm" action="/searchdd" data-cars-url="{% url 'ajax_load_cars' %}">
    {% csrf_token %}
    <div class="col-md-12">
        <div class="row">
            <div class="col-md-3">
                <label for="" class="white">From Year</label>
                <select name="from_date" id="fromdate" class="dp-list">
                    <option disabled selected="true" value="">--select Year--</option>
                    {% for mfd in manfd %}
                    <option value="{{mfd.ManufacturingDate|date:'Y'}}">{{mfd.ManufacturingDate|date:'Y'}}</option>
                    {% endfor %}
                </select>
            </div>
            <div class="col-md-3">
                <label for="" class="white">To Year</label>
                <select name="to_date" id="todate" class="dp-list">
                    <option disabled selected="true" value="">--select Year--</option>
                    {% for mfd in manfd %}
                    <option value="{{mfd.ManufacturingDate|date:'Y'}}">{{mfd.ManufacturingDate|date:'Y'}}</option>
                    {% endfor %}
                </select>
            </div>
        </div>
    </div>
</form>

2. 修复views.py的过滤逻辑

def searchdd(request):
    carForm = Car.objects.all()
    fromdate = request.POST.get('from_date')
    todate = request.POST.get('to_date') 

    # 链式调用叠加过滤条件,不会覆盖之前的查询集
    if fromdate:    
        # 跨外键查询生产年份大于等于起始年份
        carForm = carForm.filter(mfdate__ManufacturingDate__year__gte=int(fromdate))    
    if todate:
        # 跨外键查询生产年份小于等于结束年份
        carForm = carForm.filter(mfdate__ManufacturingDate__year__lte=int(todate))

    context = {'carForm':carForm} 
    return render(request, 'app/searchdd.html', context)

补充说明

如果需要精确到具体日期而非年份,只需要修改下拉框的value绑定为mfd.ManufacturingDate的完整日期值,过滤时去掉__year后缀,直接用mfdate__ManufacturingDate__gte和mfdate__ManufacturingDate__lte匹配即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:06:06