@Soitjeのソリューションを使用する:https ://stackoverflow.com/a/37648265/1031191
def filter__in_preserve(queryset: QuerySet, field: str, values: list) -> QuerySet:
"""
.filter(field__in=values), preserves order.
"""
# (There are not going to be missing cases, so default=len(values) is unnecessary)
preserved = Case(*[When(**{field: val}, then=pos) for pos, val in enumerate(values)])
return queryset.filter(**{f'{field}__in': values}).order_by(preserved)
album_ids = [24, 15, 25, 19, 11, 26, 27, 28]
albums =filter__in_preserve(album.objects, 'id', album_ids).all()
album_idsが一意であることを確認する必要があることに注意してください。
備考:
1.)このソリューションは、SQLインジェクション攻撃のリスクを冒すことなく、他のフィールドで安全に機能するはずです。
2.)Case
(Django doc )はhttps://stackoverflow.com/a/33753187/1031191のようなSQLクエリを生成します
order by case id
when 24 then 0
when 15 then 1
...
else 8
end