В Django, как мне отсортировать модель на поле, а затем получить последний элемент? - PullRequest
21 голосов
/ 31 октября 2008

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

pub_date = models.DateField("date published")

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

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

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

Ответы [ 5 ]

33 голосов
/ 31 октября 2008
obj = Edition.objects.latest('pub_date')

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

obj = Edition.objects.latest()

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

21 голосов
/ 31 октября 2008

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

Edition.objects.order_by('-pub_date')[0]
4 голосов
/ 31 октября 2008

Примечание:

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

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

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

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 способ сделать это.

0 голосов
/ 31 июля 2013

На этот вопрос уже был дан ответ, но для большей справки вот что Книга Джанго может сказать о нарезке данных на 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]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...