Список Python для побитовых операций - PullRequest
9 голосов
/ 18 января 2012

Есть ли способ взять список выражений запроса django (например, Q(first_name="Jordan"), где Q - django.db.models.Q) и побитовые ИЛИ их вместе?

Другими словами, у меня есть что-то вродеэто:

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 (и я предполагаю, что она более оптимизирована, чем моя функция здесь).

ХотяЯ заинтересован в этом для этого приложения, я просто интересуюсь им теоретически.

1 Ответ

19 голосов
/ 18 января 2012

Вы, вероятно, хотите

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

Это поместит побитовое или (|) между всеми элементами в search_params, начиная с пустого условия Q().

...