В django, как мне отсортировать модель на поле, а затем получить последний элемент?
В частности, у меня есть модель, у которой есть поле, подобное этому
pub_date = models.DateField("date published")
Я хочу иметь возможность легко захватить объект с помощью последнего pub_date
. Каков самый простой/лучший способ сделать это?
Будет ли что-то вроде следующего делать то, что я хочу?
Edition.objects.order_by('pub_date')[:-1]
Ответы
Ответ 1
obj = Edition.objects.latest('pub_date')
Вы также можете упростить вещи, разместив get_latest_by
в модели Meta, тогда вы сможете сделать
obj = Edition.objects.latest()
Подробнее см. документы. Вероятно, вы также захотите установить опцию ordering
Meta.
Ответ 2
Ответ Harley - это путь к случаю, когда вы хотите, чтобы последнее соответствовало некоторым критериям упорядочения для определенных моделей, как и вы, но общее решение состоит в том, чтобы отменить порядок и получить первый элемент:
Edition.objects.order_by('-pub_date')[0]
Ответ 3
Примечание:
Нормальные списки python принимают отрицательные индексы, которые означают смещение от конца списка, а не начало, как положительное число. Тем не менее, объекты QuerySet будут подбрасывать
AssertionError: Negative indexing is not supported.
, если вы используете отрицательный индекс, поэтому вам нужно сделать то, что сказал insin: отменить порядок и захватить элемент 0th
.
Ответ 4
Будьте осторожны при использовании
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 способ сделать это.
Ответ 5
Это уже ответили, но для получения дополнительной информации это то, что Django Book должно сказать о Slicing Data on 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]
Подробнее см. ссылку. Надеюсь, что это поможет!