Pergunta

(Por favor, deixe -me saber se isso é completamente absurdo, essa é provavelmente uma razão pela qual não encontrei nada sobre isso.)

Esta história tem dois modelos Ranking e Artist, Ranking está genericamente relacionado a Artist (object_id, content_type ... o shebang inteiro).

Eu tenho uma lista de objetos devolvidos por Ranking.objects.values_list() ordenado por um determinado campo (no meu caso score). Então, obviamente, se eu quiser exibir uma lista de artistas classificados, eu os gostaria da mesma ordem. Eu tentei métodos diferentes, como .filter(pk__in=list), .in_bulk(list), etc. tentou coagir o resultado de .values_list() em uma tupla também.

Todos eles pegam minha 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]

E devolva assim:

>>> 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]

(Estou apenas dando os IDs no segundo caso pelo bem da sanidade.)

No momento, a única maneira de fazer isso funcionar é criar uma lista vazia e percorrer o nãovalues_list() consulta.

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

Isso apenas produz n Consultas, então estou me perguntando se há uma maneira melhor. Conforme mostrado pelas tags, estou usando o PostgreSQL.

Foi útil?

Solução

Isso não é causado por Django; Seu banco de dados está retornando nessa ordem, pois nenhuma ordem é especificada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top