django Создание набора запросов с объектами Q

У меня есть форма, которая позволяет вам выбирать несколько типов проектов для фильтрации. Например, предположим, что у вас есть типы проектов «Исследование», «Обучение» и «Оценка».

В основном то, что я хочу сделать, это построить набор запросов, используя объекты Q, такие как:

projects.filter(Q(type__type="Research") | Q(type__type="Training"))

Я просто не уверен, как построить это без ввода filter() в виде строки, которая выдает ошибку:

querystring = ""
for t in types:
    querystring += " | Q(type__type="+t+")"
projects.filter(querystring) ## produces error: "ValueError: too many values to unpack"

Итак, как можно перебрать типы для создания набора запросов с объектами Q?


person richard008    schedule 26.11.2013    source источник


Ответы (1)


Вы просто строите строку, не имеющую отношения к фактическим Q() объектам запроса; начните с первого экземпляра Q() и добавьте больше:

query = Q(type__type=types[0])
for t in types[1:]:
    query |= Q(type__type=t)
projects.filter(query)

Вы также можете использовать функцию functools.reduce(), чтобы сделать это:

from functools import reduce
from operator import or_

query = reduce(or_, (Q(type__type=t) for t in types))
projects.filter(query)

Вызов reduce() делает то же самое, что и цикл for выше; возьмите ряд объектов Q(..) и объедините их в более крупный запрос со всеми частями, объединенными с | или операциями.

person Martijn Pieters    schedule 26.11.2013