Djangoで特定のアイテムを優先してソートする

【Django】文字列で好きな順番にソートする【Case, When】 【Django】文字列で好きな順番にソートする【Case, When】 特定のアイテムを指定して、それらのアイテムのソート順を上にする場合、
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オブジェクトをソートします。
リストに含まれないアイテムは、リストの後ろに配置されます。
この方法を使うと、特定のアイテムのソート順を上に持ってくることができます。

【Django】文字列で好きな順番にソートする【Case, When】 【Django】文字列で好きな順番にソートする【Case, When】

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です