Я хочу написать запрос Django, эквивалентный этому запросу SQL:
SELECT * from user where income >= 5000 or income is NULL.
Как построить фильтр наборов запросов Django?
User.objects.filter(income__gte=5000, income=0)
Это не работает, потому что это AND
фильтры. Я хочу, чтобы OR
фильтры, чтобы получить объединение отдельных наборов запросов.
Ответы:
через документацию
источник
Поскольку QuerySets реализует
__or__
оператор Python (|
) или объединение, он просто работает. Как и следовало ожидать,|
бинарный оператор возвращаетQuerySet
такorder_by()
,.distinct()
и другие фильтры QuerySet может быть добавленным к концу.Обновление 2019-06-20: теперь это полностью документировано в справочнике по API QuerySet Django 2.1 . Более историческое обсуждение можно найти в билете DjangoProject # 21333 .
источник
Оба варианта уже упомянуты в существующих ответах:
и
Тем не менее, кажется, что существует некоторая путаница относительно того, какой из них предпочтительнее.
Дело в том, что они одинаковы на уровне SQL , поэтому не стесняйтесь выбирать, что вам нравится!
Django ORM Cookbook говорит довольно подробно об этом, вот соответствующая часть:
приводит к
и
приводит к
источник: django-orm-cookbook
источник