2010-01-20 1 views
1

У меня есть это соединение:Django QuerySet API: Как я могу присоединиться к iexact и значкам?

lawyers = Lawyer.objects.filter(last__iexact=last_name).filter(first__icontains=first_name) 

This is the site

Если вы попробуете Фамилия: Abbas и Имя: Амр он говорит вам, что амр аббас имеет 1 одноклассниц.

Но если вы попробуете Имя только в нем говорится, что в базе данных, называемой amr, нет адвокатов (очевидно, есть).

Если я меняю (last__iexact=last_name) на (last__icontains=last_name), то остальное Фамилия бланков прекрасна и amr.

Но с last__icontains=last_name, если вы ищете «collin», вы также получаете «collins» и «collingwood», что не то, что я хочу.

Вы знаете, как я могу использовать iexact, а также игнорировать его, если он пуст?

Благодаря

Это функция просмотра:

def search_form(request): 
    if request.method == 'POST': 
     search_form = SearchForm(request.POST) 
     if search_form.is_valid(): 
      last_name = search_form.cleaned_data['last_name'] 
      first_name = search_form.cleaned_data['first_name'] 
      lawyers = Lawyer.objects.filter(last__iexact=last_name).filter(first__icontains=first_name) 
      if len(lawyers)==0: 
       form = SearchForm() 
       return render_to_response('not_in_database.html', {'last': last_name, 'first': first_name, 'form': form}) 
      if len(lawyers)>1: 
       form = SearchForm(initial={'last_name': last_name}) 
       return render_to_response('more_than_1_match.html', {'lawyers': lawyers, 'last': last_name, 'first': first_name, 'form': form}) 
      q_school = Lawyer.objects.filter(last__icontains=last_name).filter(first__icontains=first_name).values_list('school', flat=True) 
      q_year = Lawyer.objects.filter(last__icontains=last_name).filter(first__icontains=first_name).values_list('year_graduated', flat=True) 
      lawyers1 = Lawyer.objects.filter(school__iexact=q_school[0]).filter(year_graduated__icontains=q_year[0]).exclude(last__icontains=last_name) 
      form = SearchForm() 
      return render_to_response('search_results.html', {'lawyers': lawyers1, 'last': last_name, 'first': first_name, 'form': form}) 
    else: 
     form = SearchForm() 
     return render_to_response('search_form.html', {'form': form, }) 

ответ

4

Вы не должны строить QuerySet все на одном дыхании.

lawyers = Lawyer.objects.all() 
if last_name: 
    lawyers = lawyers.filter(last__iexact=last_name) 
if first_name: 
    lawyers = lawyers.filter(first__icontains=first_name) 

Django не будет оценивать QuerySet, пока не нужно (в данном случае, Len() сила вызова его оценку), так что вы можете держать штабелирование фильтров на все дни долго, пока вы не будете готовы запустите запрос.

http://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets-are-evaluated

Кроме того, вам не нужно создавать новые QuerySets позже, вы можете просто использовать существующий.

q_school = Lawyer.objects.filter(last__icontains=last_name).filter(first__icontains=first_name).values_list('school', flat=True) 
q_year = Lawyer.objects.filter(last__icontains=last_name).filter(first__icontains=first_name).values_list('year_graduated', flat=True) 

Может быть:

q_school = lawyers.values_list('school', flat=True) 
q_year = lawyers.values_list('year_graduated', flat=True) 
+0

Отлично! Спасибо. Я исправил первую часть, и теперь она работает. Я посмотрю на другого позже. У меня будет также шаблонный вопрос. Еще раз спасибо. – Zeynel

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

  • Нет связанных вопросов^_^