【问题标题】:Filtering records by incrementing parameters in Django通过在Django中增加参数来过滤记录
【发布时间】:2010-12-17 04:23:12
【问题描述】:

我已经能够为我的应用实施过滤解决方案...到目前为止,我已经按年份、品牌和车身样式过滤了车辆库存。我想要做的是以这种方式过滤记录:

假设我在 make 中选择 Acura,在结果页面中,如果我选择其他过滤器之一,即年份或体型,我只需要包含 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,
    })

【问题讨论】:

    标签: django filtering


    【解决方案1】:

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

    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)
    

    这行得通吗?

    【讨论】:

    • 我已经编写了代码,但从未进行过测试...我只是假设它工作正常。显然它没有......会话没有保存。我有五个与上面类似的视图……关于年份、品牌、系列、颜色和车身风格。我真的需要帮助,因为我没有想法
    • 如果不了解您是如何使用会话的,那真是帮不上忙——也许发布一个新问题?但请先查看会话文档 (docs.djangoproject.com/en/dev/topics/http/sessions),看看是否有任何明显的遗漏。
    • 对于如何使用会话我真的一无所知...我查看了文档,但我无法让它工作。我还需要弄清楚如何将所有过滤器合二为一,因为目前我有五个单独的过滤器(我认为这就是我遇到困难的原因)。我真的需要这个工作......这是我应用程序的最后一部分
    • 我很乐意提供帮助,但不能不知道您目前在做什么以及出了什么问题。您的另一个(已关闭)问题只是这个问题的重复,但您需要询问您在会话中遇到的实际问题,包括一些显示问题的代码。
    • 我已经发布了过滤器的整个代码......我还没有弄清楚如何使用会话,所以我想答案将从这里开始。理想情况下,我希望只有一个过滤器视图而不是当前的五个,但如果会话可以在当前的五个视图中正常工作,它仍然可以。我希望你现在能帮助我。
    猜你喜欢
    • 2020-11-22
    • 1970-01-01
    • 2016-02-21
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多