2012-10-03 68 views
2

我有兩個Django過濾器,我想用來過濾帖子,但一個帖子可以有很多類別,所以我已經把類別放在URL列表中。現在問題來了 - 我需要根據帖子的標題和類別進行過濾,但是我需要以某種方式進行過濾,以便使我能夠檢查所選類別的聯合。以下是當前的代碼:Django草垛過濾

sqs = SearchQuerySet().all() 

if 'title' in request.GET and request.GET['title'] != '': 
    sqs = sqs.filter_and(title=request.GET['title']) 

if 'category' in request.GET and request.GET['category'] != '': 
    catlist = request.GET.getlist('category') 

    for i in catlist: 
     sqs = sqs.filter_or(category=i) 

非常感謝您的幫助!

更多信息:Django的1.4.1,Django的草堆1.2.7

編輯:

我做了什麼,你的建議(使用__in):

if 'title' in request.GET and request.GET['title'] != '': 
    sqs = sqs.filter_and(title=request.GET['title']) 

if 'category' in request.GET and request.GET['category'] != '': 
    catlist = request.GET.getlist('category') 

    sqs = sqs.filter_or(category__in=catlist) 

但仍然沒有運氣 - 我無法按字段和類別進行搜索。只按類別搜索似乎正在工作,但當這兩個字段一起輸入時,它們不起作用。

回答

8

使用django.db.models.Q和聯合行動或__in

sqs.filter(Q(category=i) | Q(category=j)) 

(你可以聯盟Q的提交到filter之前)

或者使用__in:

sqs.filter(category__in=catlist) 

我會說出一些包沒有鏈接,因爲使用它們很簡單。

從shell中嘗試調試和runnig查詢。要進行調試,請安裝ipdb並在要停止的位置的視圖中添加此行。

import ipdb; ipdb.set_trace() 

您將在控制檯窗口中看到shell(不在瀏覽器中)。在調試外殼中鍵入hhelp。嘗試django調試工具欄,它可以幫助調試queires(它具有SQL調試面板),在瀏覽器中工作。

也嘗試在shell中進行查詢。安裝django-extensions並使用shell_plus:

manage.py shell_plus 

IPython也會有所幫助。在shell中,嘗試運行查詢並查看結果。只有當你確定他們能夠按照你的想法工作時,才把邏輯放在視圖中。否則,通過刷新頁面進行調試是一條很長的路。

如果您需要乙醚類,或標題匹配,這樣做:

q = Q() 
title = request.GET.get('title'): 
if title: 
    q |= Q(title__contains=title) # q = q | Q(...) 

if request.GET.get('category'): 
    for cat in request.GET.getlist('category'): 
     q |= Q(category=cat) 

sqs = SearchQuerySet.filter(q) 
+0

我用了第二種方案,但沒有運氣。看到我編輯的問題。感謝您的回答。 – dark4p

+0

看起來標題不在任何這些類別中。如果將兩者結合起來,則這些項目必須同時具有列表中的一個類別和該標題。如果您只需滿足這些條件中的任意一個,則使用'Q(field = value)| Q(...)...' –

+0

另外一個建議使用shell進行調試。 –