2012-04-26 119 views
8

是否有可能复制这种特定的SQL排序的Django的ORM:Django的ORDER_BY特定的顺序

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 

回答

3

你可以做到这一点瓦特/ extra()或更多普通raw(),但他们不能很好地工作更复杂的情况。

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 ...)') 

对于你的代码,条件集是非常有限的,你可以很容易地在Python中排序。

21

由于Django 1.8你有Conditional Expressions因此使用extra不再需要。

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

非常整洁的答案! – 2016-05-03 05:47:27