Как передать список Q для фильтрации по ИЛИ? - PullRequest
4 голосов
/ 20 марта 2009

Как передать список Q для фильтрации по ИЛИ? Что-то вроде:

q_list = [Q(xyz__isnull=True), Q(x__startswith='x')]?

Без списка я бы сделал:

Model.objects.filter(Q(xyz__isnull=True) | Q(x__startswith='x'))

Ответы [ 2 ]

15 голосов
/ 20 марта 2009

Используйте функцию Python Reduce ():

import operator
reduced_q = reduce(operator.or_, q_list)
Model.objects.filter(reduced_q)
7 голосов
/ 02 октября 2009

Объекты Q также имеют метод add, который принимает другой объект Q и соединитель Q (И или ИЛИ).

q_object = Q(xyz__isnull=True)
q_object.add(Q(x__startswith='x'), Q.OR)

Я считаю, что это полезно при создании фильтров OR, и я написал более длинный пример в своем блоге: «Добавление» объектов Q в Django

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...