2008-12-09 68 views
4

我有一個MultipleChoiceField在持有汽車的形式。我想過濾我的汽車數據庫到已檢查的品牌,但這會導致問題。如何動態獲取所有Q(make=...)語句?Django動態OR查詢

我如何開始:['value1', 'value2', ...]

如何我想結束:Q(col='value1') | Q(col='value2') | ...

我有幾個其他的方法。我試着爲每個make添加查詢集並以相反的方式執行(執行多個排除),但他們都很慢。

回答

6

你試過了嗎:Model.objects.filter(make__in=list_of_makes)

的list_of_makes就是由MultipleChoiceField

回來見the query set reference有關__in操作。

+0

這是巫術魔法! – Oli 2008-12-09 09:45:55

4

有在#django提供了另一種方法:

reduce(lambda x,y: x | y, [Q1, Q2, Q3, ...]) 

Ber's method是偉大的,這種情況下,但如果你需要在動態列過濾,映射看起來像下一個乾淨的方式。

+0

你可以在這裏使用__in運營商還,如果動態構造參數: 查詢= { '%s__in' %COL_NAME:list_of_values} 使用關鍵字ARG擴展 Model.objects.filter(**查詢) – Ber 2008-12-09 11:42:22

3

我試圖奧利的答案,但它沒有工作,即使有減少(),因爲它出現Q對象不接受字典作爲參數:

以下是我有它的工作:

# These are the fields I want to search with an OR clause 
search_fields = ['title__icontains', 'publisher__name__icontains', 'authors__name__icontains'] 

search = 'search string' 
clauses = [] 
for item in search_fields: 
    clauses.append(queryset.filter(**{item: search})) 
    queryset = reduce(lambda x, y: x | y, clauses).distinct() 

檢查性能問題,因爲我只能用小數據集進行測試。