2012-02-25 9 views
5

Estoy ejecutando una consulta para obtener los últimos 5 artículos News. En mi plantilla, quiero mostrar el primer elemento en una ubicación, luego los 4 restantes en la parte inferior de la página.La mejor manera de cortar un queryset de Django sin golpear la base de datos más de una vez

En mi plantilla, hago algo como esto:

{% for n in news|slice:":1" %} 
    {{ n.headline }} 
{% endfor %} 

... more HTML ... 

{% for n in news|slice:"1:" %} 
    {{ n.headline }} 
{% endfor %} 

Cuando miro en la barra de depuración, esto se traduce en dos consultas a la base de datos: uno con LIMIT 1 y otro con LIMIT 4 OFFSET 1, pero por lo demás el mismo . Aprecio que esta es la manera en que Django inteligentemente solo solicita las cosas que realmente usas, pero en este caso parece un poco excesivo. ¿Cuál es la mejor manera de hacer este tipo de cosas?

+0

Desde la perspectiva de un programador, ciertamente está llamando a un bucle 'for' dos veces, y ambos están configurados en una plantilla que llama a una consulta. ¿Podrías tomar los 5 a la vez, almacenarlos en el cliente y mostrar el contenido de una copia en caché? – Droogans

+0

bueno, eso es lo que trato de hacer. En la vista, agarro los 5, pero el conjunto de preguntas solo evalúa cuando trato de cortar el primero 1. Sin embargo, el primero para el bucle realmente no necesita ser un bucle ya que es solo 1 elemento. –

Respuesta

5

Solo necesita forzar el conjunto de preguntas para que se evalúe antes del corte. Esto podría hacerse simplemente llamando al len() en su vista antes de pasarlo al contexto.

Los documentos de Django tienen un complete list of everything that causes a queryset to evaluate. Solo haz algo de esa lista y estás bien.

9

Convierta a una secuencia en la vista, luego recorte la secuencia.

var = list(somequery[:5]) 
+0

¿Quiere decir '' var = list (somequery) [: 5] ''? –

+4

@Riley: No. Eso recupera * todos * registros y luego divide los primeros 5, mientras que lo que escribí recupera los primeros 5 y deja que la plantilla corte el primero. –

+0

Ah, ya veo lo que quieres decir. Creo que las palabras me desanimaron. –

Cuestiones relacionadas