既然存在Case
and When
在 Django >= 1.11 中,你可以用一种更像 orm 的方式来实现,保留查询集的所有优点:
from django.db import models
order = ['b', 'a', 'z', 'x', 'c']
_whens = []
for sort_index, value in enumerate(order):
_whens.append(
models.When(my_field=value, then=sort_index)
)
qs = MyModel.objects.annotate(
_sort_index=models.Case(
*_whens,
output_field=models.IntegerField()
)
)
qs.order_by('_sort_index')
这将生成如下内容:
from django.db import models
order = ['b', 'a', 'z', 'x', 'c']
qs = MyModel.objects.annotate(
_sort_index=models.Case(
models.When(my_field='b', then=0),
models.When(my_field='a', then=1),
models.When(my_field='z', then=2),
models.When(my_field='x', then=3),
models.When(my_field='c', then=4),
output_field=models.IntegerField()
)
).order_by('_sort_index')
我建议仅将其用于少量列表项,因为它会破坏数据库查询。
https://docs.djangoproject.com/ko/1.11/ref/models/conditional-expressions/#case https://docs.djangoproject.com/ko/1.11/ref/models/conditional-expressions/#case