通过在Django中递增参数来过滤记录

时间:2009-11-16 19:09:47

标签: django filtering

我已经能够为我的应用程序实现过滤解决方案...到目前为止,我已按年份,制造和车身样式过滤车辆库存。我想做的是以这种方式过滤记录:

假设我选择了Acura in make,在结果页面中,如果我选择其中一个过滤器,即年份或体型,我只需要包含Acura和所选年份或体型的记录。

其中一个过滤器的代码如下:

def year_filter(request, year):   
   vehicle_query = Vehicle.objects.filter(
    common_vehicle__year__year__exact=year
    ).exclude(status__status='Incoming')

   vehicle_list = vehicle_query.order_by(
    'common_vehicle__series__model__manufacturer__manufacturer', 
    'common_vehicle__series__model__model', 
    'common_vehicle__year'
)

   vehicle = paginate(request, vehicle_list)

   year_count = vehicle_query.order_by(
    '-common_vehicle__year__year')
            .values('common_vehicle__year__year')
            .annotate(count=Count('id')
   )
   make_count = vehicle_query.order_by(
      'common_vehicle__series__model__manufacturer__manufacturer')
      .values('common_vehicle__series__model__manufacturer__manufacturer')
      .annotate(count=Count('id')
)
    style_count = vehicle_query.order_by(
   'common_vehicle__body_style__style')
       .values('common_vehicle__body_style__style')
       .annotate(count=Count('id')
)
    color_count = vehicle_query.order_by(
       'exterior_colour__exterior_colour')
       .values('exterior_colour__exterior_colour')
       .annotate(count=Count('id')
)

    return render_to_response('vehicles.html', {
      'vehicle': vehicle, 
      'make_count': make_count, 
      'year_count': year_count, 
      'style_count': style_count,
    })

1 个答案:

答案 0 :(得分:2)

首先,一些风格建议:你要做四个单独的查询,但每个查询都以完全相同的方式开始:

Vehicle.objects.filter(
   common_vehicle__series__model__manufacturer__manufacturer=make
).exclude(
   status__status='Incoming'
)

为了便于阅读,请考虑将其分配给变量,例如vehicle_query,然后您可以在每个后续查询中使用该变量:

vehicle_list = vehicle_query.order_by(
   'common_vehicle__series__model__manufacturer__manufacturer', 
   'common_vehicle__series__model__model', 
   'common_vehicle__year'
)

直到最后一分钟才会对查询进行评估,因此这不会影响效率,但会更具可读性。

现在,回答你的问题:你显然需要某种方法将所选择的值从一个视图保存到下一个视图。我不太明白其他观点如何适应这一点 - 我最初的倾向是把它放在一个隐藏的领域,或者在查询字符串中。但也许将它保存在会话中是最好的主意:

if request.POST:
    chosen_vehicle = request.POST['vehicle_type']
    request.session['vehicle_type'] = chosen_vehicle.id
    return HttpResponseRedirect('/next/view/')

并在下一个视图中:

previously_chosen = request.session['vehicle_type']
filtered = Vehicle.objects.get(id=previously_chosen)

这有用吗?