Có thể tái tạo loại đặt sql cụ thể trong ORM django:Django order_by thứ tự cụ thể
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
?
Có thể tái tạo loại đặt sql cụ thể trong ORM django:Django order_by thứ tự cụ thể
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
?
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.
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')
câu trả lời rất gọn gàng! –