Django QuerySet API: Как мне присоединиться к iexact и icontains? - PullRequest
1 голос
/ 20 января 2010

У меня есть это присоединение:

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

Это сайт

Если вы попробуете Фамилию: Аббас и Имя: Амр, это говорит о том, что у Амр Аббаса 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, })

1 Ответ

4 голосов
/ 20 января 2010

Вам не нужно создавать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...