2012-03-23 10 views
10

Tengo una lista de identificadores de los objetos que necesito tomar, luego tengo que ordenarlos por su marca de tiempo. Así es como yo iba a hacerlo:Django: tomar un conjunto de objetos de la lista de identificación (y ordenar por la marca de tiempo)

For i in object_ids: 
    instance = Model.objects.get(id = i) 
    # Append instance to list of instances 

#sort the instances list 

Pero hay dos cosas que me molestan:

  • ¿No hay manera de agarrar una colección de entradas de una lista de sus documentos de identidad - sin tener hacer un bucle?
  • ¿Puedo agregar objetos arbitrarios al QuerySet solo en función de sus ID?

Gracias,

Respuesta

18

Esto se puede hacer usando un código de este tipo:

objects = Model.objects.filter(id__in=object_ids).order_by('-timestamp') 

la order_by puede ser positivo o negativo timestamp, dependiendo de cómo desea resolver el problema.

+4

¿Cuál es la mejor manera de obtener los objetos devueltos en el mismo orden que la lista object_ids? El código OPs? – Chris

+2

Probablemente buscaré los datos de la base de datos con solo una llamada (como la anterior) y luego haré la clasificación en tu código. Debería ser más rápido que consultar la base de datos N veces. Especialmente con una gran N. – kender

+0

@kender @Chris ¿Tenemos alguna solución para 'en el mismo orden que la lista object_ids' en lugar de ordenar después de ir a buscar? – Dipak

8

Pruebe lo siguiente:

result = Model.objects.filter(id__in=object_ids) 

Esto devuelve todos los objetos que tienen Model su id en la lista dada de object_ids. De esta forma, tampoco es necesario agregar modelos adicionales al QuerySet resultante.

Cuestiones relacionadas