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

StackOverflow https://stackoverflow.com/questions/252242

Вопрос

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

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]

Обратитесь по ссылке для получения дополнительной информации. Надеюсь, это поможет!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top