Ошибка возникает из-за того, что qs.reverse () порождает новый экземпляр QuerySet, поэтому вы не отменяете старый.
Если вы хотите иметь базовую QS для действий, вы можете сделать следующее:
>>> augmented_books = Book.objects.extra(select={'price': 2))
>>> augmented_books[0].price
2
>>> augmented_books_rev = augmented_books.reverse()
>>> augmented_books_rev[0].price
2
Конечно, ключевое слово select
может быть гораздо более сложным, фактически это может быть практически любой значимый фрагмент SQL, который может соответствовать [XXX]
в
SELECT ..., [XXX] as price, ... FROM ... WHERE ... (etc)
EDIT
Как указано в других ответах, это решение может быть неэффективным.
Если вы обязательно получите все объекты Book из запроса, то вам лучше сделать один запрос, сохранить его в списке и, в конечном итоге, полностью изменить полученный список.
Если, с другой стороны, вы получаете «голову» и «очередь» таблицы, лучше сделать два запроса, потому что вы не будете запрашивать все «средние» бесполезные объекты.