Как выполнить условие ИЛИ в наборе запросов Django?

184

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

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

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

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

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

Теги:
django-queryset
django-orm

2 ответа

378
Лучший ответ
from django.db.models import Q
User.objects.filter(Q(income__gte=5000) | Q(income__isnull=True))

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

  • 0
    Было бы полезно, если бы вы добавили распечатку object.query, чтобы мы могли связать вывод ORM и Query, чтобы ознакомиться с ним. Кстати отличный пример.
32

Потому что 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')
  • 16
    «без документов» и «наследие» меня пугают. Я думаю, что безопаснее использовать объект Q, как подробно описано в принятом ответе здесь.
  • 3
    Тем не менее, я могу подтвердить, что это все еще работает с июля 14 года!
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню