2012-01-17 108 views
9

是否有一種方法可以獲取django查詢表達式的列表(例如Q(first_name="Jordan"),其中Qdjango.db.models.Q)並將它們按位或運算在一起?Python列表按位操作

換句話說,我有這樣的事情:

search_string = "various search terms" 

而且我想這樣做:

search_params = [Q(description__icontains=term) for term in re.split(r'\W', search_string)] 
search_params = something_magical(search_params) 
results = Record.objects.filter(search_params) 

其中search_params相當於現在Q(description__icontains="various") | Q(description__icontains="search" | Q(description__icontains="terms"

我知道這將可以用這樣的功能:

def something_magical(lst): 
    result = lst[0] 
    for l in lst[1:] 
     result |= l 
    return result 

所以我想知道這個功能是否已經內置到Python中(並且我假設它比我的函數在這裏更優化)。

雖然我對這個應用感興趣,但我也只是對它感興趣。

+0

我不認爲有這樣一個Django操作符...但是,你可以只做所有的「或」查詢,然後使用Python集操作符來結合結果? (http://docs.python.org/library/sets.html#set-objects) – 2012-01-17 23:44:46

+0

@RichardGreen可以創建相當醜陋的查詢 – 2012-01-18 01:07:24

回答

19

你可能想

import operator 
from functools import reduce # Python 3 
search_params = reduce(operator.or_, search_params, Q()) 

這將會把一個逐位或search_params所有項目之間(|),從一個空的條件Q()

+0

不錯!像這樣的事情讓我的愛蟒越來越多。 – 2012-01-18 04:35:36

+0

剛剛花了一點時間玩減少'和'地圖'。 – 2012-01-18 21:14:49

+0

太棒了,你喜歡它!那麼你可能還會喜歡[itertools](http://docs.python.org/library/itertools.html)。 – 2012-01-18 22:51:48