Подтвердить что ты не робот

В django, как мне отсортировать модель на поле, а затем получить последний элемент?

В частности, у меня есть модель, у которой есть поле, подобное этому

pub_date = models.DateField("date published")

Я хочу иметь возможность легко захватить объект с помощью последнего pub_date. Каков самый простой/лучший способ сделать это?

Будет ли что-то вроде следующего делать то, что я хочу?

Edition.objects.order_by('pub_date')[:-1]
4b9b3361

Ответ 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]

Подробнее см. ссылку. Надеюсь, что это поможет!