Как выполнить условие ИЛИ в django queryset? - PullRequest
249 голосов
/ 04 июля 2011

Я хочу написать запрос Django, эквивалентный этому запросу SQL:

SELECT * from user where income >= 5000 or income is NULL.

Как создать фильтр набора запросов Django?

User.objects.filter(income__gte=5000, income=0)

Это не работает, потому что этоAND s фильтры.Я хочу OR фильтры, чтобы получить объединение отдельных наборов запросов.

Ответы [ 2 ]

476 голосов
/ 04 июля 2011
from django.db.models import Q
User.objects.filter(Q(income__gte=5000) | Q(income__isnull=True))

через документацию

52 голосов
/ 11 октября 2012

Поскольку QuerySets реализует оператор Python __or__ (|) или объединение, он просто работает.Как и следовало ожидать, двоичный оператор | возвращает QuerySet, поэтому order_by(), .distinct() и другие фильтры набора запросов могут быть прикреплены до конца.

combined_queryset = User.objects.filter(income__gte=5000) | User.objects.filter(income__isnull=True)
ordered_queryset = combined_queryset.order_by('-income')

Обновление 2019-06-20: Теперь это полностью документировано в справочнике по API QuerySet Django 2.1 .Более историческое обсуждение можно найти в билете DjangoProject # 21333 .

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