2012-04-26 25 views

Trả lời

3

Bạn có thể làm điều đó w/extra() hoặc đồng bằng hơn raw(), nhưng chúng không hoạt động tốt với tình huống phức tạp hơn.

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

Đối với mã của bạn, tập hợp điều kiện rất hạn chế, bạn có thể sắp xếp bằng Python dễ dàng.

21

Vì Django 1.8 bạn có Conditional Expressions vì vậy việc sử dụng extra là không cần thiết nữa.

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

câu trả lời rất gọn gàng! –

Các vấn đề liên quan