2012-09-27 4 views
7

PostgreSQL per impostazione predefinita considera i valori NULL come i più alti, quindi li ordina prima per le query discendenti e per quelli ascendenti.Come modificare il comportamento di ordinamento null predefinito da PostgreSQL nell'ORM Django

È possibile modificare questo comportamento per query o alla creazione dell'indice specificando "NULLS LAST" o "NULLS FIRST".

Come posso utilizzarlo in combinazione con l'ORM Django, senza la necessità di utilizzare query non elaborate? I.e. quando aggiungo al mio query_set qualcosa come qs.order_by("-publish_start"), come posso specificare l'ordinamento per i null? Oppure, in alternativa, sulla dichiarazione di campo/indice.

risposta

9

ho capito un modo che può ospitare motori DB che funzionano in entrambi i casi (null come alto o più basso valore) utilizzando extra, rendendo controllare il nulla un valore booleano, e quando sono ordinati booleani false < true sembra essere universale:

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

Vale la pena affermare (perché sono lento e mi ci è voluto un po 'per capire) che se vuoi che i risultati siano prima con valori NULL, e poi "publish_start' ha ordinato ASCending, devi invertire l'istruzione order_by: '['-null_start', 'publish_start']'. –

+0

'extra' è deprecato, vedi invece http://stackoverflow.com/a/35494930/15690. – blueyed

+0

@blueyed sì questo è ciò che hanno le risposte di 4 anni nello stack overflow. Diventano obsoleti. Non c'è bisogno di downvotare per quello ... –

Problemi correlati