1

私はこの参加をしています:

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

これはサイトです

Last Name:AbbasとFirst Name:Amrを試してみると、amrabbasには1人の学友がいることがわかります。

しかし、名だけを試してみると、データベースにamrという弁護士がいないことがわかります(明らかにあります)。

に変更(last__iexact=last_name)すると(last__icontains=last_name)、[名前]を空白のままにすると正常に機能し、amrが見つかります。

しかし、last__icontains=last_name「コリン」を検索すると、「コリンズ」と「コリングウッド」も表示されますが、これは私が望んでいることではありません。

私がどのように使用できるか知っていますか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

1 に答える 1

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

さらに、後で新しいQuerySetを作成する必要はなく、既存のQuerySetを使用するだけで済みます。

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)
于 2010-01-20T17:43:42.120 に答える