On Nov 23, 8:51 am, Aizen <[email protected]> wrote:
> Hi,
>
> I'd like to implement filtering for my app...currently, the filtering
> I have is stateless and so I can't add onto whatever value the user
> last selected.  I've also implemented each filter separately, so I'd
> like to know how I can condense the five filters into one.  

There are a couple of confounding points in your question.

First question is about combining your filters.  The solution there
seems to be to factor out your query building code out of your views
and return the the resulting queryset.  Then, these can be chained
together in any of your views just like any other queryset.

The other question seems to be about "refining" a filter?  That is
confining a filter operation to an existing found set, and have that
functionality spread across multiple requests.  You basically will
need to figure out a way to pass this along between requests, using
either hidden form fields, or session framework.

I started to work on adding this as a feature to Alex Gaynor's django-
filter, but got bogged down working out some details.  Either way you
should check out that project as it would at least make your existing
implementation easier.

http://github.com/alex/django-filter

-Preston

> The code
> for my filters is as follows:
>
> 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,
>     })
>
> def make_filter(request, make):
>    vehicle_query = Vehicle.objects.filter(
>       common_vehicle__series__model__manufacturer__manufacturer=make)
>       .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,
>     })
>
> def series_filter(request, model):
>    vehicle_query = Vehicle.objects.filter(
>       common_vehicle__series__series=model)
>       .exclude(status__status='Incoming')
>
>    vehicle_list = vehicle_query.order_by(
>       'common_vehicle__series__series',
>       '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,
>     })
>
> def body_filter(request, body):
>    vehicle_query = Vehicle.objects.filter(
>       common_vehicle__body_style__style=body)
>       .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,
>     })
>
> def color_filter(request, color):
>    vehicle_query = Vehicle.objects.filter(
>       exterior_colour__exterior_colour=color)
>       .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,
>     })

--

You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=.


Reply via email to