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