我有一個MultipleChoiceField
在持有汽車的形式。我想過濾我的汽車數據庫到已檢查的品牌,但這會導致問題。如何動態獲取所有Q(make=...)
語句?Django動態OR查詢
我如何開始:['value1', 'value2', ...]
如何我想結束:Q(col='value1') | Q(col='value2') | ...
我有幾個其他的方法。我試着爲每個make添加查詢集並以相反的方式執行(執行多個排除),但他們都很慢。
我有一個MultipleChoiceField
在持有汽車的形式。我想過濾我的汽車數據庫到已檢查的品牌,但這會導致問題。如何動態獲取所有Q(make=...)
語句?Django動態OR查詢
我如何開始:['value1', 'value2', ...]
如何我想結束:Q(col='value1') | Q(col='value2') | ...
我有幾個其他的方法。我試着爲每個make添加查詢集並以相反的方式執行(執行多個排除),但他們都很慢。
你試過了嗎:Model.objects.filter(make__in=list_of_makes)
?
的list_of_makes就是由MultipleChoiceField
回來見the query set reference有關__in
操作。
有在#django提供了另一種方法:
reduce(lambda x,y: x | y, [Q1, Q2, Q3, ...])
Ber's method是偉大的,這種情況下,但如果你需要在動態列過濾,映射看起來像下一個乾淨的方式。
你可以在這裏使用__in運營商還,如果動態構造參數: 查詢= { '%s__in' %COL_NAME:list_of_values} 使用關鍵字ARG擴展 Model.objects.filter(**查詢) – Ber 2008-12-09 11:42:22
我試圖奧利的答案,但它沒有工作,即使有減少(),因爲它出現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()
檢查性能問題,因爲我只能用小數據集進行測試。
這是巫術魔法! – Oli 2008-12-09 09:45:55