Попытка уменьшить объекты Django Q с помощью operator.or_, кажется, приводит к уменьшению с помощью 'AND' - PullRequest
1 голос
/ 15 ноября 2011

Я работаю над приложением на Python / Django. Я пытаюсь создать фильтр, уменьшив список объектов Q с помощью функции Python operator.or_. К сожалению, в результате получается список, который объединяется с AND, а не operator.or_. Проблема возникает в следующем коде:

print 'operator.or_', operator.or_
filter = reduce(operator.or_, q_objects[key])
print key, '->', filter

Заявление

print 'operator.or_', operator.or_

Результаты в

operator.or_ <built-in function or_>

так что это кажется успешным. Однако

filter = reduce(operator.or_, q_objects[key])
print key, '->', filter    

Результаты в (с добавленным форматированием)

some_key -> (
        AND: 
        ('some_field__icontains', u'search string 1'), 
        ('other_field__icontains', u'search string 2')
    )

Как видите, результат имеет AND, а не OR. Кто-нибудь может увидеть, что я делаю не так?

Что касается q_objects[key], то оно создается следующим образом:

q_dict = {'some_field__icontains': u'search string 1', 'other_field__icontains': u'search string 2'}
q_objects[key] = [Q(**q_dict)]

1 Ответ

2 голосов
/ 15 ноября 2011
q_objects[type] = [Q(**q_dict)]

Нет.Вам нужно обрабатывать каждый элемент отдельно.

q_objects[type] = [Q(**{k: v}) for (k, v) in q_dict.iteritems()]
...