2012-09-27 12 views
7

PostgreSQL domyślnie uważa wartości NULL za najwyższe, a więc sortuje je jako pierwsze dla zstępujących zapytań i ostatnio dla rosnących.Jak zmienić domyślne zachowanie sortowania zerowego z PostgreSQL w ORM Django

Możesz modyfikować to zachowanie dla zapytania lub tworzenia indeksu, określając 'NULLS LAST' lub 'NULLS FIRST'.

Jak mogę użyć tego w połączeniu z ORM Django, bez potrzeby korzystania z nieprzetworzonych zapytań? tj. kiedy dodam do mojego query_set coś w stylu qs.order_by("-publish_start"), jak mogę określić sortowanie dla wartości null? Lub, alternatywnie, w deklaracji pola/indeksu.

Odpowiedz

9

ja wymyśliliśmy sposób, który może pomieścić silniki DB, które działają w obu kierunkach (null jako najwyższa lub najniższa wartość) za pomocą extra, czyniąc null sprawdzić wartość logiczną, a przy sortowaniu wartości logicznych false < true wydaje się być uniwersalne:

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

Warto napisać (ponieważ jestem powolny i zajęło mi to trochę czasu), że jeśli chcesz, aby wyniki miały najpierw wartości NULL, a następnie 'publish_start' sortowane ASCending, musisz odwrócić instrukcję order_by: '['-null_start', 'publish_start']'. –

+0

'Dodatkowe' jest deprecjonowane, patrz zamiast tego http://stackoverflow.com/a/35494930/15690. – blueyed

+0

@blueyed tak, to jest to, co mają 4-letnie odpowiedzi w przepełnieniu stosu. Rosną one przestarzałe. Nie trzeba się zgodzić na to ... –

Powiązane problemy