2009-11-24 3 views
1

Я хотел бы настроить фильтр в своем приложении ... Я бы хотел, чтобы мои фильтры выполнялись с шагом, вроде того, что работает на this site. Пока мои просмотры фильтров являются отдельными (есть ли способ комбинирования логики фильтрации в одном представлении?), И я предполагаю, что мне нужно каким-то образом сохранить выбранный фильтр (возможно, сеансы ... но я не уверен как это сделать). Мой код, как показано ниже:Настройка фильтра в django

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, 'color_count': color_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')) 
series_count = vehicle_query.order_by('common_vehicle__series__series').values('common_vehicle__series__series').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, 'series_count': series_count, 'year_count': year_count, 'style_count': style_count, 'color_count': color_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, 'color_count': color_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, 'color_count': color_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, 'color_count': color_count,}) 

ответ

1

Вы пишите менеджеру. Из вашего примера нужен по крайней мере один метод для vehicle_query, один метод для .annotate(count=Count('id')) и, возможно, некоторые для повторных order_by() с.

Если вам нужны методы в гнездо, так что вы можете сделать vehicle_query(year).with_counts(), а также with_counts().vehicle_query(year), вы должны сделать свой собственный QuerySet тоже, то есть: наследовать от QuerySet, добавить методы там, а затем использовать этот QuerySet в вашем менеджер и методы отображения в менеджере методам в наборе запросов.

from django.db import models 
from django.db.models.query import QuerySet 

class VehicleQuerySet(QuerySet): 
    def vehicle_query(self, year): 
     return self.filter(common_vehicle__year__year__exact=year).exclude(status__status='Incoming') 

class VehicleManager(models.Manager): 
    def get_query_set(self): 
     return VehicleQuerySet(self.model) 

    def vehicle_query(self, year): 
     return self.get_query_set().vehicle_query(year) 

class WhateverModel(models.Model): 
    ... 
    objects = models.Manager() # keeping the default manager 
    smart_objects = VehicleManager() # additional manager 

Тогда в ваших просмотров:

vehicle_query = Vehicle.smart_objects.vehicle_query(year) 
+0

Есть ли другой способ сделать это ... возможно, используя сеансы? Возможно, это только я, но я не могу понять этот бит кода. – Stephen

+0

Это очень распространенный способ. следуйте ссылке ozan, чтобы узнать о менеджерах. – vikingosegundo

+0

BTW, сохранит ли это мои значения между запросами? – Stephen

2

Такого рода логика, что managers для. Даже если вы решите не использовать менеджеров, вы должны разложить общий код другим способом, с которым вы знакомы. (Предпочитаете процедурное программирование? Напишите функцию полезности. Знакомы с ООП? Создайте вызываемые классы, основанные на классах, которые наследуют от класса, который содержит логику фильтрации.) Если вы обнаружите, что копируете и вставляете такой код, это знак того, что вы слишком часто сталкиваются с проблемами.

+0

так как именно я могу идти о решении моей проблемы? Я не так хорош в Django ... это мое первое приложение BTW – Stephen

Смежные вопросы