Django get a QuerySet from array of id's in specific order Django get a QuerySet from array of id's in specific order arrays arrays

Django get a QuerySet from array of id's in specific order


Since Django 1.8, you can do:

from django.db.models import Case, Whenpk_list = [10, 2, 1]preserved = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(pk_list)])queryset = MyModel.objects.filter(pk__in=pk_list).order_by(preserved)


I don't think you can enforce that particular order on the database level, so you need to do it in python instead.

id_list = [1, 5, 7]objects = Foo.objects.filter(id__in=id_list)objects = dict([(obj.id, obj) for obj in objects])sorted_objects = [objects[id] for id in id_list]

This builds up a dictionary of the objects with their id as key, so they can be retrieved easily when building up the sorted list.


If you want to do this using in_bulk, you actually need to merge the two answers above:

id_list = [1, 5, 7]objects = Foo.objects.in_bulk(id_list)sorted_objects = [objects[id] for id in id_list]

Otherwise the result will be a dictionary rather than a specifically ordered list.