Я просто хотел показать, что встроенные решения (только для SQL) не всегда являются лучшими. Сначала я подумал, что поскольку метод Django QuerySet.objects.order_by
принимает несколько аргументов, вы можете легко их объединить:
ordered_authors = Author.objects.order_by('-score', 'last_name')[:30]
Но это не работает так, как вы ожидаете. В качестве примера можно привести список президентов, отсортированный по баллам (для лучшего чтения выберите 5 лучших):
>>> auths = Author.objects.order_by('-score')[:5]
>>> for x in auths: print x
...
James Monroe (487)
Ulysses Simpson (474)
Harry Truman (471)
Benjamin Harrison (467)
Gerald Rudolph (464)
Используя решение Алекса Мартелли, которое точно обеспечивает 5 лучших людей, отсортированных по last_name
:
>>> for x in sorted(auths, key=operator.attrgetter('last_name')): print x
...
Benjamin Harrison (467)
James Monroe (487)
Gerald Rudolph (464)
Ulysses Simpson (474)
Harry Truman (471)
А теперь объединенный order_by
вызов:
>>> myauths = Author.objects.order_by('-score', 'last_name')[:5]
>>> for x in myauths: print x
...
James Monroe (487)
Ulysses Simpson (474)
Harry Truman (471)
Benjamin Harrison (467)
Gerald Rudolph (464)
Как вы можете видеть, это тот же результат, что и первый, то есть он не работает так, как вы ожидаете.