Фильтрация записей путем увеличения параметров в Django - PullRequest
1 голос
/ 16 ноября 2009

Мне удалось внедрить решение для фильтрации для моего приложения ... пока у меня есть фильтрация по году, марке и типу кузова для инвентаря автомобиля. Я хочу отфильтровать запись следующим образом:

Предположим, что я выбрал Acura в 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 Ответ

2 голосов
/ 16 ноября 2009

Во-первых, несколько советов по стилю: вы делаете четыре отдельных запроса, но каждый из них начинается точно так же:

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)

Это работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...