2012-09-27 8 views
7

'daki PostgreSQL'deki varsayılan boş sıralama davranışı varsayılan olarak NULL değerlerini en yüksek olarak kabul eder ve bu nedenle bunları önce azalan sorgular için ve daha sonra da artanlar için sonlandırır.Django ORM

Sorgu başına veya "NULLS LAST" veya "NULLS FIRST" ifadelerini belirterek bu davranışı, bu davranış üzerinde değiştirebilirsiniz.

Django ORM ile birlikte, ham sorgu kullanmanıza gerek kalmadan bunu nasıl kullanabilirim? I.e. qs.order_by("-publish_start") gibi bir sorgu_setime eklediğimde null için sıralama nasıl belirleyebilirim? Veya alternatif olarak alan/dizin bildirimi üzerine.

cevap

9

Ben Boolean false < true sıralarken, extra kullanarak boş bir boolean kontrol yaparak ve iki yönden birinde (boş olarak yüksek veya en düşük değer) çalışmak DB motorları barındırmaktadır bir yol evrensel olduğu görünüyor anladım:

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

Bunu belirtmeye değer (çünkü yavaş olduğumu ve anlamaya biraz zamanımı kattı) eğer sonuçların önce NULL değerleri ile olmasını istiyorsanız ve daha sonra yayınlama_start 'ASCending siparişi verdiyseniz, order_by deyimini tersine çevirmeniz gerekir: ['-null_start', 'publish_start'] '. –

+0

'extra' kullanımdan kaldırılmıştır, bkz. Http://stackoverflow.com/a/35494930/15690. – blueyed

+0

@blueyed evet, yığının taşmasıyla ilgili 4 yaşındaki cevapların ne olduğu var. Eskimişler. Bunun için düşüşe gerek yok ... –

İlgili konular