Quiero escribir una consulta Django equivalente a esta consulta SQL:
SELECT * from user where income >= 5000 or income is NULL.
¿Cómo construir el filtro de conjunto de consultas Django?
User.objects.filter(income__gte=5000, income=0)
Esto no funciona, porque son AND
los filtros. Quiero que OR
los filtros obtengan la unión de conjuntos de consultas individuales.
Respuestas:
a través de la documentación
fuente
Debido a que QuerySets implementa el
__or__
operador Python (|
), o unión, simplemente funciona. Como era de esperar, el|
operador binario devuelve unaQuerySet
maneraorder_by()
,.distinct()
y otros filtros de QuerySet se puede unir hasta el final.Actualización 2019-06-20: Esto ahora está completamente documentado en la referencia de la API de QuejanSet de Django 2.1 . Se puede encontrar más discusión histórica en el boleto de DjangoProject # 21333 .
fuente
Ambas opciones ya se mencionan en las respuestas existentes:
y
Sin embargo, parece haber cierta confusión con respecto a cuál preferir.
El punto es que son idénticos en el nivel SQL , ¡así que siéntete libre de elegir lo que quieras!
El libro de cocina de Django ORM habla en detalle sobre esto, aquí está la parte relevante:
lleva a
y
lleva a
fuente: django-orm-cookbook
fuente