Pregunta

(Por favor, hágamelo saber si esto es completamente absurdo, que es probablemente una razón por la que no he encontrado nada en esto.)

Esta historia tiene dos modelos Ranking y Artist, Ranking es genéricamente en relación con Artist (object_id, content_type ... todo el asunto).

Tengo una lista de los objetos devueltos por Ranking.objects.values_list() ordenado por un determinado campo (en mi caso score). Así que, obviamente, si quiero mostrar una lista de artistas que fueron clasificados, yo quiero que en el mismo orden. He intentado diferentes métodos, tales como .filter(pk__in=list), .in_bulk(list), etc. Probado coaccionar el resultado de .values_list() en una tupla también.

Todos ellos toman mi lista:

>>> objects = Ranking.objects.filter(<stuff>).order_by('score')
>>> objects_list = objects.values_list('object_id', flat=True)
>>> objects_list
[8, 1, 2, 15, 14, 3, 13, 31, 16, 5, 4, 7, 32, 9, 37]

y devolverlo, así:

>>> Artist.objects.filter(id__in=objects_list).values_list('id', flat=True)
[7, 32, 3, 8, 4, 2, 31, 9, 37, 13, 16, 1, 5, 15, 14]

(sólo estoy dando los ID en el segundo caso por el bien de la cordura.)

En este momento la única manera que puedo conseguir que esto funcione es crear una lista vacía y bucle a través de la consulta no values_list().

for item in objects:
    ranked_items.append(item.content_object)

Esto se produce consultas n, por lo que estoy preguntando si hay una mejor manera. Como se muestra en las etiquetas, estoy usando PostgreSQL.

¿Fue útil?

Solución

Esto no es causado por Django; su base de datos que está regresando en este orden, ya que no se especifica ningún pedido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top