2009-12-25 52 views
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)。任何人都可以用語法來幫忙,還是有更多的事情與我正在努力完成的事情有關?

回答

1

您可以嘗試chain filters,如:

>>> 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) 
...) 

另外有用的例子包括在文檔中:

+0

我不相信這種類型的鏈條在這種情況下是可行的。例如,如果我的客戶是XEROX,並且該客戶有2個帳戶與我「複印機富」和「複印機欄」。如果「複印機欄」是我的搜索詞,則過濾器將搜索名爲「複印機欄」的客戶端,併爲輔助帳戶過濾器返回0個對象的查詢集。 雖然會繼續搜索文檔。格拉西亞斯。 – kjarsenal 2009-12-25 18:43:51

0

重組視圖代碼以分離客戶記錄( prdlinks)從帳戶記錄s(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) 
2

我認爲你正在尋找的Q對象(通過該MYYN作爲refrenced)

from django.db.models import Q 

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

complex-lookups-with-q-objects

+0

試圖導入Q對象。問題在於,如果我沒有將prdlinks與acclink分開,Q查詢將適用於客戶端對象,因爲它滿足第三個「if」查詢:「if len(prdlinks)> = 1:...」 但是,如果搜索項是一個帳戶名稱(而不是客戶名稱), 查詢確實返回一個「prdlink」,但不返回任何記錄,因爲if查詢正在查找(client__icontains = query)。結果是它呈現一個空模板。 (並且不會繼續評估要求(account__icontains = query))的以下「elif」查詢)。 – kjarsenal 2009-12-25 21:20:23