o que estou tentando fazer é o seguinte:
obtenha os 30 autores com maior pontuação (
Author.objects.order_by('-score')[:30]
)ordenar os autores por
last_name
Alguma sugestão?
python
django
django-models
RadiantHex
fonte
fonte
Respostas:
A respeito
No Django 1.4 e mais recente, você pode fazer o pedido fornecendo vários campos.
Referência: https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by
order_by (* campos)
Por padrão, os resultados retornados por a
QuerySet
são ordenados pela tupla de ordenação fornecida pelaordering
opção no Meta do modelo. Você pode substituir isso por QuerySet usando oorder_by
método.Exemplo:
O resultado acima será ordenado em ordem
score
decrescente e depois em ordemlast_name
crescente. O sinal negativo na frente de"-score"
indica ordem decrescente. A ordem crescente está implícita.fonte
lambda x: x.last_name
? É mais curto, mais detalhado e não precisa de nenhuma importação.Eu só queria ilustrar que as soluções integradas (somente SQL) nem sempre são as melhores. A princípio pensei que, como o
QuerySet.objects.order_by
método do Django aceita vários argumentos, você poderia facilmente encadea-los:Mas não funciona como você esperaria. Caso em questão, primeiro está uma lista de presidentes classificados por pontuação (selecionando os 5 primeiros para facilitar a leitura):
Usando a solução de Alex Martelli, que fornece com precisão as 5 principais pessoas classificadas por
last_name
:E agora a
order_by
chamada combinada :Como você pode ver, é o mesmo resultado do primeiro, o que significa que não funciona como você esperava.
fonte
Esta é uma maneira que permite empates para a pontuação de corte.
Você pode obter mais de 30 autores em top_authors dessa forma e
min(30,author_count)
há no caso de você ter menos de 30 autores.fonte