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

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

pub_date = models.DateField("date published")

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

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

Edition.objects.order_by('pub_date')[:-1]
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
21
0
18 774
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.
if you use a negative index, which is why you have to do what insin said: reverse the ordering and grab the 0th element.

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

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() - это способ джангонический сделать это.

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

Note that negative slicing is not supported:

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

This is easy to get around, though. Just change the order_by() statement, like this:

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

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

Другие вопросы по теме