Как выполнить или условие в django queryset?


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

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

как построить фильтр Django queryset?

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

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

2 214

2 ответа:

from django.db.models import Q
User.objects.filter(Q(income__gte=5000) | Q(income__isnull=True))

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

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

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