2012-04-26 10 views
8

Ist es möglich, diese Art von spezifischer SQL-Bestellung in der django ORM zu replizieren:Django order_by bestimmte Reihenfolge

order by 

(case 

    when id = 5 then 1 

    when id = 2 then 2 

    when id = 3 then 3 

    when id = 1 then 4 

    when id = 4 then 5 

end) asc 

?

Antwort

3

Sie könnten es w/extra() oder mehr einfach raw() tun, aber sie können nicht gut w/komplexere Situation arbeiten.

qs.extra(select={'o':'(case when id=5 then 1 when id=2 then 2 when id=3 then 3 when id=1 then 4 when id=4 then 5 end)', order_by='o'} 

YourModel.raw('select ... order by (case ...)') 

für Ihren Code, Zustand Satz sehr begrenzt ist, könnte man leicht in Python sortieren.

21

Da Django 1.8 Sie Conditional Expressions so mit extra haben, ist nicht mehr notwendig.

from django.db.models import Case, When, Value, IntegerField 

SomeModel.objects.annotate(
    custom_order=Case(
     When(id=5, then=Value(1)), 
     When(id=2, then=Value(2)), 
     When(id=3, then=Value(3)), 
     When(id=1, then=Value(4)), 
     When(id=4, then=Value(5)), 
     output_field=IntegerField(), 
    ) 
).order_by('custom_order') 
+1

sehr saubere Antwort! –

Verwandte Themen