co próbuję zrobić to:
zdobądź 30 autorów z najwyższym wynikiem (
Author.objects.order_by('-score')[:30]
)zamów autorów wg
last_name
Jakieś sugestie?
python
django
django-models
RadiantHex
źródło
źródło
Odpowiedzi:
Co powiesz na
W Django 1.4 i nowszych można składać zamówienia, udostępniając wiele pól.
Źródła: https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by
order_by (* pola)
Domyślnie wyniki zwracane przez a
QuerySet
są uporządkowane według krotki porządkowania podanej przezordering
opcję w Meta modelu. Możesz to zmienić na podstawie QuerySet przy użyciuorder_by
metody.Przykład:
Powyższy wynik zostanie uporządkowany
score
malejąco, a następnielast_name
rosnąco. Znak minus przed"-score"
oznacza malejącą kolejność. Domniemany jest porządek rosnący.źródło
lambda x: x.last_name
? Jest krótszy, bardziej szczegółowy i nie wymaga importu.Chciałem tylko zilustrować, że wbudowane rozwiązania (tylko SQL) nie zawsze są najlepsze. Na początku pomyślałem, że
QuerySet.objects.order_by
skoro metoda Django przyjmuje wiele argumentów, możesz łatwo połączyć je w łańcuch:Ale to nie działa tak, jak można by się tego spodziewać. Przykładowo, pierwsza to lista prezydentów posortowana według punktacji (wybranie 5 najlepszych dla łatwiejszego czytania):
Korzystając z rozwiązania Alexa Martelli, które dokładnie przedstawia 5 najlepszych osób posortowanych według
last_name
:A teraz połączone
order_by
połączenie:Jak widać, jest to ten sam wynik, co pierwszy, co oznacza, że nie działa zgodnie z oczekiwaniami.
źródło
Oto sposób, który pozwala na remisy dla końcowego wyniku.
W ten sposób możesz znaleźć więcej niż 30 autorów w top_authors, a
min(30,author_count)
jeśli masz mniej niż 30 autorów.źródło