django - переупорядочить набор запросов после нарезки - PullRequest
7 голосов
/ 02 июня 2009

Я получаю последние 5 строк из модели Foo, упорядоченной по полю даты и времени.

qs = Foo.objects.all()[:5]

На следующем шаге я хочу изменить порядок запросов по некоторым другим критериям (фактически, по тому же полю даты-времени в противоположном направлении). Но изменение порядка после среза не допускается. reverse () отменяет первый порядок, давая мне другой набор запросов. Есть ли способ выполнить то, что я хочу, не создавая список из набора запросов и не упорядочивая его?

Ответы [ 3 ]

14 голосов
/ 02 июня 2009

order_by дает вам порядок SQL в базе данных. Вы уже используете это, а затем нарезаете на это. В этот момент результаты извлекаются в память. Если вы хотите изменить их порядок, вам нужно использовать сортировку в памяти Python, а не сортировку в базе данных ORM.

В вашем случае Даниэль уже дал лучшее решение: поскольку вы просто хотите отсортировать по тому же полю, но в другом порядке, просто переверните список, который у вас есть:

qs = Foo.objects.all()[:5]
objs = reversed(qs)

Если бы вы хотели отсортировать по какому-либо другому полю, то вы бы использовали функцию sorted () с пользовательской функцией клавиши:

qs = Foo.objects.all()[:5]
objs = sorted(qs, key=lambda o: o.some_other_field)
12 голосов
/ 02 июня 2009

Нет, это невозможно. order_by - это операция с базой данных, но когда вы разбираете набор запросов, он оценивается и после этого не возвращается в базу данных.

Звучит так, будто вы уже знаете решение: выполните reversed() на оцененных qs.

qs = reversed(Foo.objects.all()[:5])
1 голос
/ 04 июня 2012

Поздний ответ, но у меня это сработало:

import random
sorted(queryset[:10], key=lambda x: random.random())
...