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

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

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

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

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

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

2 ответов


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

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


, потому что объекты QuerySet реализации питон __or__ оператор (|), или union, он просто работает. Как и следовало ожидать,| двоичный оператор возвращает 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')