Есть ли способ заставить запрос соблюдать порядок введенных параметров? - PullRequest
3 голосов
/ 12 февраля 2010

(Пожалуйста, дайте мне знать, если это абсолютно абсурдно, возможно, поэтому я ничего не нашел по этому поводу.)

В этой истории две модели Ranking и Artist, Ranking в общем связаны с Artist (object_id, content_type ... весь шебанг).

У меня есть список объектов, возвращаемых Ranking.objects.values_list(), упорядоченных по определенному полю (в моем случае score). Очевидно, что если я хочу отобразить список художников, которые были ранжированы, я бы хотел, чтобы они были в том же порядке. Я пробовал разные методы, такие как .filter(pk__in=list), .in_bulk(list) и т. Д. Попытался также принудительно привести результат .values_list() в кортеж.

Все они берут мой список:

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

И вернуть так:

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

(ради здравомыслия я просто даю идентификаторы во втором случае.)

Прямо сейчас единственный способ заставить это работать - создать пустой список и выполнить цикл по запросу, отличному от values_list().

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

Это просто производит n запросов, поэтому мне интересно, есть ли лучший способ. Как показывают теги, я использую PostgreSQL.

1 Ответ

2 голосов
/ 12 февраля 2010

Это не вызвано Джанго; ваша база данных возвращает их в этом порядке, так как порядок не указан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...