В django, как мне отсортировать модель по полю, а затем получить последний элемент?
-
05-07-2019 - |
Вопрос
В частности, у меня есть модель, которая имеет поле, подобное этому
pub_date = models.DateField("date published")
Я хочу иметь возможность легко захватывать объект с помощью самого последнего pub_date
.Какой самый простой / наилучший способ сделать это?
Будет ли что-то вроде следующего делать то, что я хочу?
Edition.objects.order_by('pub_date')[:-1]
Решение
obj = Edition.objects.latest('pub_date')
Вы также можете упростить задачу, добавив <код > get_latest_by в Meta модели, тогда вы сможете сделать
obj = Edition.objects.latest()
См. документы . для получения дополнительной информации. Возможно, вы также захотите установить порядок
Мета-вариант.
Другие советы
Ответ Харли - это путь для случая, когда вы хотите получить последнюю версию в соответствии с некоторыми критериями заказа для конкретных моделей, как вы делаете, но общее решение состоит в том, чтобы отменить порядок и извлечь первый элемент:
Edition.objects.order_by('-pub_date')[0]
Примечание:
Обычные списки python принимают отрицательные индексы, которые обозначают смещение от конца списка, а не от начала, как положительное число.Однако объекты набора запросов вызовут
AssertionError: Negative indexing is not supported.если вы используете отрицательный индекс, вот почему вы должны делать то, что сказал инсин:измените порядок действий в обратном порядке и возьмите
0th
элемент.
Будьте осторожны с использованием
Edition.objects.order_by('-pub_date')[0]
как вы могли бы индексировать пустой QuerySet. Я не уверен, каков правильный подход Pythonic, но самое простое было бы заключить его в if / else или try / catch:
try:
last = Edition.objects.order_by('-pub_date')[0]
except IndexError:
# Didn't find anything...
Но, как сказал @Harley, когда вы упорядочиваете по дате, latest ()
- это djangonic способ сделать это.
На этот вопрос уже был дан ответ, но для большей справки, это то, что Книга Джанго должен сказать о нарезке данных на QuerySets:
Обратите внимание, что отрицательная нарезка не поддерживается:
>>> Publisher.objects.order_by('name')[-1] Traceback (most recent call last): ... AssertionError: Negative indexing is not supported.
Это легко обойти, хотя. Просто измените order_by () утверждение, как это:
>>> Publisher.objects.order_by('-name')[0]
Обратитесь по ссылке для получения дополнительной информации. Надеюсь, это поможет!