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


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

pub_date = models.DateField("date published")

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

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

Edition.objects.order_by('pub_date')[:-1]
5 21

5 ответов:

obj = Edition.objects.latest('pub_date')

Вы также можете упростить вещи, поместив get_latest_by в мете модели, то вы сможете сделать

obj = Edition.objects.latest()

Смотритедокументы для получения дополнительной информации. Вы, вероятно, также захотите установить ordering мета-вариант.

Ответ Харли - это способ пойти в том случае, когда вы хотите получить последнюю версию в соответствии с некоторыми критериями упорядочения для конкретных моделей, как вы это делаете, но общее решение состоит в том, чтобы изменить порядок и получить первый элемент:

Edition.objects.order_by('-pub_date')[0]

Примечание:

Обычные списки python принимают отрицательные индексы, которые обозначают смещение от конца списка, а не начало, как положительное число. Однако объекты QuerySet вызовут

AssertionError: Negative indexing is not supported.
если вы используете отрицательный индекс, именно поэтому вы должны сделать то, что сказал инсин: изменить порядок и захватить элемент 0th.

Будьте осторожны с использованием

Edition.objects.order_by('-pub_date')[0]

Как вы могли бы индексировать пустой QuerySet. Я не уверен, что правильный Питонский подход, но самым простым было бы обернуть его в if / else или try / catch:

try:
    last = Edition.objects.order_by('-pub_date')[0]
except IndexError:
    # Didn't find anything...
Но, как сказал @Harley, когда вы заказываете по дате, latest() - это djangonic способ сделать это.

На это уже был дан ответ, но для более подробной справки, вот что говорит Книга Django о нарезке данных на QuerySets:

Обратите внимание, что отрицательная нарезка не поддерживается:

>>> Publisher.objects.order_by('name')[-1]
Traceback (most recent call last):
  ...
AssertionError: Negative indexing is not supported.

Хотя это легко обойти. Просто измените порядок.() утверждение, подобное этому:

>>> Publisher.objects.order_by('-name')[0]

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