2

基本的な検索ビューがあります。現在、特定のクライアントからのオブジェクトをデータベースに照会しています。ビューコードは次のとおりです。

def search_page(request):
        form = PrdSearchForm() 
        prdlinks = [] 
        show_results = True 
        if request.GET.has_key('query'): 
                show_results = True 
                query = request.GET['query'].strip() 
                if query:
                        form = PrdSearchForm({'query' : query}) 
                        prdlinks = \
                                ProjectRecord.objects.filter(client__icontains=query)

        if len(prdlinks) >= 1:
            records = ProjectRecord.objects.filter(client__icontains=query)
            t = get_template('org_list_client.html')
            html = t.render(Context({'records': records}))
            return HttpResponse(html)

        else:
            tpl = "prd_search.html"
            variables = RequestContext(request, { 'form': form, 
            'prdlinks': prdlinks, 
            'show_results': show_results}) 
            return render_to_response(tpl, variables)

検索フィールドで、クライアントとアカウントの両方でオブジェクトをチェックしたいのですが。これには、次のコードの変更が含まれると思います。

if query:
        form = PrdSearchForm({'query' : query}) 
        prdlinks = \
                 ProjectRecord.objects.filter(client__icontains=query)

含めるProjectRecord.objects.filter(account__icontains=query)。誰かが構文を手伝ってもらえますか、それとも私が達成しようとしていることにもっと関わっていますか?

4

3 に答える 3

2

私はあなたがオブジェクトを探していると思いますQ(MYYNによって参照されたように)

from django.db.models import Q

records=ProjectRecord.objects.filter(
  Q(client__icontains=query) |
  Q(account__icontains=query)
)

複雑なルックアップとqオブジェクト

于 2009-12-25T21:00:45.107 に答える
1

次のように、フィルタを連鎖させることができます。

>>> ProjectRecord.objects.filter(
...    client__icontains=query).filter(account__icontains=query)

これにより、最初にクエリを含むクライアントがフィルタリングされ、次にアカウントにクエリが含まれるこの結果クエリセットがフィルタリングされます。

一般的な形式:

>>> Entry.objects.filter(
...     headline__startswith='What'
... ).exclude(
...     pub_date__gte=datetime.now()
... ).filter(
...     pub_date__gte=datetime(2005, 1, 1)
... )

さらに役立つ例がドキュメントに含まれています。

于 2009-12-25T18:15:42.390 に答える
0

クライアント レコード (prdlinks) をアカウント レコード (acclinks) から分離し、別々に処理するようにビュー コードを再構築しました。それが機能するかどうかはわかりませんでしたが(機能します)、これがコードを記述する最も効率的な方法であるかどうかもわかりません(おそらくそうではありません)。いずれにせよ、修正されたコードは次のとおりです。

def search_page(request):
        form = PrdSearchForm() 
        prdlinks = []
        **acclinks = []**
        show_results = True 
        if request.GET.has_key('query'): 
                show_results = True 
                query = request.GET['query'].strip() 
                if query:
                        form = PrdSearchForm({'query' : query}) 
                        prdlinks = \
                                ProjectRecord.objects.filter(client__icontains=query)
                        **acclinks = \
                                ProjectRecord.objects.filter(account__icontains=query)**

        if len(prdlinks) >= 1:
            records = ProjectRecord.objects.filter(client__icontains=query)
            t = get_template('org_list_client.html')
            html = t.render(Context({'records': records}))
            return HttpResponse(html)

        **elif len(acclinks) >= 1:
            records = ProjectRecord.objects.filter(account__icontains=query)
            t = get_template('org_list_account.html')
            html = t.render(Context({'records': records}))
            return HttpResponse(html)**

        else:
            tpl = "prd_search.html"
            variables = RequestContext(request, { 'form': form, 
            'prdlinks': prdlinks, 
            'show_results': show_results}) 
            return render_to_response(tpl, variables)
于 2009-12-25T19:36:02.680 に答える