Eu quero escrever uma consulta Django equivalente a esta consulta SQL:
SELECT * from user where income >= 5000 or income is NULL.
Como construir o filtro queryset do Django?
User.objects.filter(income__gte=5000, income=0)
Isso não funciona, porque são AND
os filtros. Quero que OR
os filtros obtenham a união de conjuntos de consultas individuais.
Respostas:
via documentação
fonte
Como o QuerySets implementa o
__or__
operador Python (|
), ou union, ele simplesmente funciona. Como seria de esperar, o|
operador binário retorna umQuerySet
modoorder_by()
,.distinct()
e outros filtros queryset podem ser anexados ao fim.Atualização 2019-06-20: Agora isso está totalmente documentado na referência da API do Django 2.1 QuerySet . Discussões mais históricas podem ser encontradas no ticket do DjangoProject # 21333 .
fonte
Ambas as opções já são mencionadas nas respostas existentes:
e
No entanto, parece haver alguma confusão sobre qual deles deve preferir.
O ponto é que eles são idênticos no nível SQL , portanto, fique à vontade para escolher o que quiser!
O Django ORM Cookbook fala com mais detalhes sobre isso, aqui está a parte relevante:
leva a
e
leva a
fonte: django-orm-cookbook
fonte