2015-09-08 2 views
3

Я получил следующий вид:Джанго модель фильтра пустой строкой

def search_events(request): 
    term = request.GET.get('term', '') 
    adminDivision = request.GET.get('adminDivision', '') 
    events = Event.objects.filter(event_name__icontains=term, city__admin1=adminDivision) 
    data= serializers.serialize('json', events); 
    return HttpResponse(data, content_type='application/json') 

Он может получить 2 параметра из запроса, срок и adminDivision, а затем делает поиск по БД.

Как это работает, так это то, что когда один из них пуст, термин или adminDivision, то я не получаю никаких результатов, так как все объекты имеют некоторое значение для этих полей.

Что я хочу, если один или даже оба фильтра пустые, тогда не применяйте этот фильтр.

Пример, , если у меня есть эти объекты:

  • [event_name = 'Foo', adminDivision = '1']
  • [event_name = 'бар', adminDivision = '2']
  • [event_name = 'Foo бар', adminDivision = '3']

с term=foo (нет значения для adminDivision) в данный момент, I'am не получая никаких результатов, но я хочу его вернуть первый и третий.

Поскольку оба значения пустые, я также не получаю никаких результатов, и я хотел бы иметь их все.

Есть ли элегантный способ достичь этого?

Спасибо!

+0

Сделайте себе одолжение и использовать формы для обработки данных GET и POST запросов вместо доступа 'request.GET' непосредственно на ваш взгляд. – patrys

+0

Можете ли вы дать более подробную информацию или предоставить ссылку на примеры? Я вызываю этот метод из запроса ajax, поэтому я не уверен, как использовать формы здесь. Во всяком случае, я начинаю с django, поэтому любая обратная связь приветствуется. – mario595

ответ

1

У вас нет результатов, потому что вы выполняете запрос AND в своем фильтре. Попробуйте так:

def search_events(request): 
    term = request.GET.get('term', '') 
    adminDivision = request.GET.get('adminDivision', '') 
    events = Event.objects.all() 
    if term: 
     events = events.filter(event_name__icontains=term) 
    if adminDivision: 
     events = events.filter(city__admin1=adminDivision) 
    data= serializers.serialize('json', events); 
    return HttpResponse(data, content_type='application/json') 

Или:

from django.db.models import Q 

... 
events = Event.objects.filter(Q(event_name__icontains=term)|Q(city__admin1=adminDivision)) 
... 
+0

Спасибо, первый вариант работает так, как я хотел, второй не так, как если бы оба элемента присутствовали, он вернет весь объект, который содержит тот или иной. – mario595

+0

Да, ваш первый вариант был И, и мой второй вариант - это ИЛИ, поэтому я написал его второй, возможно, другой человек мог бы найти его полезным. – Gocht

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