2011-02-13 85 views
6

Tengo un conjunto de preguntas con eso le devolverá varias filas. Una de las filas tiene un slug "slug-456", ¿cómo puedo llegar a la siguiente fila después de esa fila que tiene el slug "slug-456" con respecto al orden actual que tiene el conjunto de preguntas?¿Cómo obtener la siguiente fila en un queryset django?

Puedo recorrer el queryset y comprobar si la fila actual tiene el slug "slug-456" y si tiene en cuenta que la siguiente fila es lo que busco, pero ¿hay una manera más eficiente?

ACTUALIZACIÓN: lo hice de esta manera:

id_list = list(qs.values_list('id', flat=True)) 
try: 
    next_id = id_list[id_list.index(obj.id) + 1] 
    obj = Object.objects.get(id=next_id) 
except IndexError: 
    pass 

Respuesta

5

Los conjuntos de consulta son generadores, por lo que no existe realmente un atajo a lo largo de las líneas qs[qs.indexof(slug="..")+1]. Cualquier solución que se presente aún requiere iteración a través del conjunto de consultas (al menos hasta el objeto de destino).

Como mencionas, una forma posible de hacerlo sería recorrer el queryset y devolver el que está justo después del que tiene slug = "slug-456".

Se podría, por supuesto, tomar una ruta más complicada y hacer algo en la línea de:

# get slugs in order 
sio = list(qs.objects.values_list('slug', flat=True)) 
target_slug = sio[sio.index(sio) + 1] # watch for KeyError 
your_object = qs.objects.get(slug__exact=target_slug) 

mientras divertido escribir, es improbable que esto tiene ninguna ventaja de rendimiento (a menos que su modelo tiene muchos ámbitos en los cuales caso iterando a través de la salida de values_list() primero podría ser beneficioso).

Respuesta relacionada: Get the index of an element in a queryset.

+0

Gracias por el enlace, encontré mi respuesta allí mezclada la última parte de la suya. – Marconi

+0

De nada. Me alegra que lo haya encontrado útil. –

+0

Estoy mirando este TypeError en este momento "El objeto QuerySet no es un iterador" después de haber pasado uno a la siguiente función incorporada. Son iterables, ya que devuelven un iterador, pero el QuerySet en sí mismo no es un iterador. –

4

Para py < 2.6,

queryset.iterator().next() 

Para> = 2,6

next(queryset.iterator()) 

debe hacer el truco

+4

Entiendo que esto obtendrá el siguiente elemento, pero todavía tengo que señalar la fila exacta primero antes de que pueda llamar a continuación() y ese es mi problema. – Marconi

Cuestiones relacionadas