lo que estoy tratando de hacer es esto:
consigue los 30 Autores con mayor puntuación (
Author.objects.order_by('-score')[:30]
)ordenar los autores por
last_name
¿Alguna sugerencia?
python
django
django-models
RadiantHex
fuente
fuente
Respuestas:
Qué pasa
En Django 1.4 y versiones posteriores, puede ordenar proporcionando varios campos.
Referencia: https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by
order_by (* campos)
De forma predeterminada, los resultados devueltos por a
QuerySet
están ordenados por la tupla de orden dada por laordering
opción en el Meta del modelo. Puede anular esto por cada QuerySet mediante elorder_by
método.Ejemplo:
El resultado anterior se ordenará
score
descendiendo y luegolast_name
ascendiendo. El signo negativo delante de"-score"
indica un orden descendente. El orden ascendente está implícito.fuente
lambda x: x.last_name
? Es más corto, más detallado y no necesita ninguna importación.Solo quería ilustrar que las soluciones integradas (solo SQL) no siempre son las mejores. Al principio pensé que debido a que el
QuerySet.objects.order_by
método de Django acepta múltiples argumentos, podría encadenarlos fácilmente:Pero no funciona como cabría esperar. Por ejemplo, primero hay una lista de presidentes ordenados por puntaje (seleccionando los 5 primeros para una lectura más fácil):
Usando la solución de Alex Martelli que proporciona con precisión las 5 personas principales ordenadas por
last_name
:Y ahora la
order_by
llamada combinada :Como puede ver, es el mismo resultado que el primero, lo que significa que no funciona como cabría esperar.
fuente
Aquí hay una forma que permite empates para el puntaje de corte.
Puede obtener más de 30 autores en top_authors de esta manera y
min(30,author_count)
existe el caso de que tenga menos de 30 autores.fuente