2009-06-02 7 views
6

Cojo las últimas 5 filas de un modelo Foo que está ordenado por un campo de fecha y hora.django - reordenar el conjunto de preguntas después de cortarlo

qs = Foo.objects.all()[:5] 

En el siguiente paso, quiero para reordenar la queryset por algunos otros criterios (en realidad, por el mismo campo de fecha y hora en la dirección opuesta). Pero reordenar después de una porción no está permitido. reverse() deshace el primer orden, dándome un conjunto de interrogaciones differet. ¿Hay alguna manera de lograr lo que quiero sin crear una lista desde el conjunto de preguntas y hacer el pedido?

Respuesta

10

No, no hay forma de hacerlo. order_by es una operación en la base de datos, pero cuando corta un conjunto de consulta, se evalúa y luego no vuelve a la base de datos.

Parece que ya conoce la solución: ejecute reversed() en el qs evaluado.

qs = reversed(Foo.objects.all()[:5]) 
+0

Así que no me he perdido nada. Gracias. – shanyu

+0

Tuve el mismo problema y seguí la sugerencia de Daniel, pero me di cuenta de que no podía usar el método de conteo en el conjunto de consultas – thchand

+0

¿No puede encontrar la referencia a reversed() en documentos de python, cualquier enlace que pueda proporcionar? –

13

order_by le ofrece el orden SQL en la base de datos. Ya estás usando eso, y luego cortarlo. En ese punto, los resultados se recuperan en la memoria. Si desea cambiar su orden, debe usar la ordenación en memoria de Python para hacerlo, no la ordenación ORM en la base de datos.

En su caso, Daniel ya ha dado la mejor solución: ya que simplemente desea ordenar el mismo campo, pero en otro orden, apenas revertir la lista tiene:

qs = Foo.objects.all()[:5] 
objs = reversed(qs) 

Si tuviera quería para ordenar por algún otro campo, a continuación, tendrá que utilizar la función sorted() con una función clave personalizada:

qs = Foo.objects.all()[:5] 
objs = sorted(qs, key=lambda o: o.some_other_field) 
+0

Sí, sé que order_by es un pedido de base de datos. Pero me ha parecido interesante que un reverse() (el método querySet) después de que el segmento esté funcionando, y que vuelva a ejecutar la consulta, dando resultados inesperados. – shanyu

+0

Cuando extrae los resultados de un conjunto de consulta, sigue siendo un conjunto de consulta válido. Si lo modifica (por ejemplo, al agregar reverse()), lo volverá a evaluar. –

1

respuesta tardía, pero esto sólo funcionó para mí:

import random 
sorted(queryset[:10], key=lambda x: random.random()) 
Cuestiones relacionadas