Он действительно не заботится о порядке, поскольку запрос выглядит следующим образом:
SELECT model.*
FROM model
WHERE model.pk <b>IN (3, 2, 1, 42)</b>
База данных может возвращать значения в любом порядке. В зависимости от используемой базы данных механизм индексации et c. порядок может быть "детерминированный c", но возможно даже, что он будет возвращать записи полностью случайным образом.
Вы можете заказать их, используя довольно сложное выражение:
from django.db.models import Case, IntegerField, Value, When
my_ids = [3,2,1,42]
Model.objects.filter(
pk__in=my_ids
).order_by(
Case(
*[<b>When(pk=pk, then=Value(i)) for i, pk in enumerate(my_ids)</b>],
output_field=IntegerField()
)<b>.asc()</b>
)
Это по-прежнему QuerySet
, и его можно использовать для ленивых запросов, но остается вопрос, почему вы хотите отсортировать элементы на основе порядка первичных ключей. Обычно модель (или связанная с ней модель) содержит более «интересные» способы упорядочивания элементов.