2016-05-17 2 views
1

Я пытаюсь сделать простой фильтр django.Фильтр, если параметр request.get() не задан

Вот мой код строки, которые делают фильтрацию:

cars = models.CarForRent.objects.filter(car_in_city=request.GET.get('city')).filter(travel_abroad=request.GET.get('travel_abroad')) 

Теперь она работает только тогда, когда все параметры установлен. Если я отправлю пустой запрос request.GET.get ('city') или пустой запрос.GET.get ('travel_abroad'), он не возвращает ничего.

Как сделать, если request.GET.get ('city') пуст, чтобы вернуть все пункты во всех городах?

Ofcourse Я мог бы написать if для каждого параметра get, но это должен быть более простой способ.

ответ

2

Прежде всего, вы могли бы улучшить свою читаемость коды путем импорта модели фильтруется:

from models import CarForRent 

Если вы делаете ручную фильтрацию вы должны использовать сослагательное наклонение.

city = request.GET.get('city') 
travel_abroad=request.GET.get('travel_abroad') 
cars = CarForRent.objects.all() 

if city: 
    cars = cars.filter(car_in_city=city) 
if travel_abroad: 
    cars = cars.filter(travel_abroad=travel_abroad) 

Альтернатива использовать что-то вроде https://github.com/carltongibson/django-filter что позволяет пустые параметры.

1

Если у вас много полеев, то это может быть стоят делать фильтрацию в цикле:

cars = models.CarForRent.objects.all() 
for fieldname in ['city', 'travel_abroad', ...]: 
    if request.GET.get('fieldname'): 
     cars = cars.filter(**{fieldname: request.GET[fieldname]}) 

Если у вас есть только несколько полей, а затем пара, если заявления, вероятно, самые простые.

1

IMO, the Q object может быть полезным в этом случае для фильтрации.

from django.db.models import Q 

city = request.GET.get('city') 
travel = request.GET.get('travel_abroad') 

q = Q() 
if city: 
    q &= Q(car_in_city=city) 
if travel: 
    q &= Q(travel_abroad=travel) 

qryset = CarForRent.objects.filter(q) 

Вы также можете использовать операцию ИЛИ вместо И.

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