Django中如何基于外键关联日期字段过滤两个日期区间的数据
现有代码问题梳理
- HTML模板错误:下拉选项的value值错误绑定了
Car.CarID,且car变量不在当前循环作用域内,后端拿到的参数完全不符合过滤需求 - 过滤逻辑错误:
mfdate是关联ManufacturingYM的外键,要过滤关联表的ManufacturingDate字段,需要用Django的跨表查询语法__(双下划线)- 现有逻辑是分别过滤日期等于起始/结束值,没有实现范围查询,且两次独立赋值查询集会覆盖前一次的结果,无法实现双条件同时生效
- 参数处理错误:无意义的参数转字符串操作,也没有适配日期/年份的查询逻辑
修复代码
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
相关产品推荐
相关产品推荐

