DjangoのORMの
annotate()
とCase()
を使うことでこれを実現できます。例として、
Item
モデルがあり、id
フィールドに基づいて特定のアイテムを上にソートしたいとします。
以下の方法でこれを実現できます:
from django.db.models import Case, When, Value, IntegerField
# 優先的にソートしたいアイテムのIDリスト
priority_ids = [3, 1, 2]
# アイテムを指定の順番でソート
items = Item.objects.annotate(
custom_order=Case(
*[When(id=id, then=Value(idx)) for idx, id in enumerate(priority_ids)],
default=Value(len(priority_ids)),
output_field=IntegerField()
)
).order_by('custom_order')
for item in items:
print(item.id)
このコードは、priority_ids
のリスト内での順序に基づいて、Item
オブジェクトをソートします。
リストに含まれないアイテムは、リストの後ろに配置されます。
この方法を使うと、特定のアイテムのソート順を上に持ってくることができます。