Using @Soitje 's solution: 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()
Note that you need to make sure that album_ids are unique.
Remarks:
1.) This solution should safely work with any other fields, without risking an sql injection attack.
2.) Case
(Django doc) generates an sql query like https://stackoverflow.com/a/33753187/1031191
order by case id
when 24 then 0
when 15 then 1
...
else 8
end