2012-09-27 24 views
7

PostgreSQL considera por defecto los valores NULOS como los más altos, y los ordena primero para las consultas descendentes y por último para los ascendentes.Cómo cambiar el comportamiento predeterminado de ordenación nula de PostgreSQL en el ORM de Django

Puede modificar este comportamiento por consulta o creación de índice especificando 'NULLS LAST' o 'NULLS FIRST'.

¿Cómo puedo usar esto junto con el ORM de Django, sin la necesidad de utilizar consultas sin formato? Es decir cuando agrego a mi query_set algo como qs.order_by("-publish_start"), ¿cómo puedo especificar la ordenación de nulos? O, como alternativa, en declaración de campo/índice.

Respuesta

9

me di cuenta de una manera que se adapte a los motores de base de datos que funcionan en ambos sentidos (nulo valor más alto o más bajo) mediante el uso de extra, por lo que la hipótesis nula comprobar un valor lógico, y al ordenar booleanos false < true parece ser universal:

qs = qs.extra(select={'null_start': "publish_start is null"}, 
       order_by=['null_start', '-publish_start']) 
+0

Vale la pena indicar (porque soy lento y me tomó un tiempo darme cuenta) que si quieres que los resultados sean primero con valores NULL y luego 'publish_start' ordenó ASCending, necesitas invertir la instrucción order_by: '['-null_start', 'publish_start']'. –

+0

'extra' está desactivado, consulte http://stackoverflow.com/a/35494930/15690. – blueyed

+0

@blueyed sí, eso es lo que tienen las respuestas de 4 años en desbordamiento de pila. Se vuelven obsoletos. No hay necesidad de rechazarlo por eso ... –

Cuestiones relacionadas