2013-11-26 64 views
1

我有一個表單,允許您選擇多個要從中過濾的項目類型。例如,假設您的項目類型爲「研究」,「培訓」和「評估」。django使用Q對象構建查詢集

基本上我希望做的是建立使用例如q對象的查詢集:

projects.filter(Q(type__type="Research") | Q(type__type="Training")) 

我只是不知道如何無過濾器()輸入建造這是一個字符串,其產生一個錯誤:

querystring = "" 
for t in types: 
    querystring += " | Q(type__type="+t+")" 
projects.filter(querystring) ## produces error: "ValueError: too many values to unpack" 

那麼,如何迭代類型來創建Q對象的查詢集?

回答

6

您只是建立一個與實際Q()查詢對象沒有任何關係的字符串;先從第一Q()實例,並添加更多:

query = Q(type__type=types[0]) 
for t in types[1:]: 
    query |= Q(type__type=t) 
projects.filter(query) 

您也可以使用functools.reduce() function做到這一點:

from functools import reduce 
from operator import or_ 

query = reduce(or_, (Q(type__type=t) for t in types)) 
projects.filter(query) 

reduce()調用不正是同樣的事情上面for循環;取一系列Q(..)對象,並將它們組合成更大的查詢,並將所有部分與|或操作組合起來。