2010-02-03 3 views

ответ

60

Вы могли бы просто сделать что-то вроде этого, используя reverse():

queryset.reverse()[0] 

Кроме того, остерегайтесь это предупреждение из документации Django:

... обратите внимание, что reverse() следует вообще можно назвать только на QuerySet , который имеет определенное упорядочение (например, при запросе модели, которую определяет порядок по умолчанию или когда с использованием order_by()). Если такого заказа не определен для данного QuerySet, вызова reverse() на него не имеет никакого реального эффекта (упорядочение было определено до вызова reverse(), и остаются неопределенными после).

+0

thnx ... не знал этого – Stephen

+1

, как сказано в django docs,: «обратите внимание, что reverse() обычно должен вызываться только на QuerySet, который имеет определенное упорядочение (например, при запросе модели, которая определяет по умолчанию или при использовании order_by()) .Если такого заказа не задано для данного QuerySet, вызов reverse() на нем не имеет реального эффекта (упорядочение не было определено до вызова reverse() и после этого будет оставаться неопределенным) «. – jujule

+2

Я отредактировал это предупреждение для вашего ответа, надеюсь, что все в порядке. –

93

Django Doc:

latest(field_name=None) возвращает последний объект в таблице, по дате, используя field_name представленного в поле даты.

Этот пример возвращает последнюю запись в таблице, в соответствии с полем pub_date:

Entry.objects.latest('pub_date') 
+20

Это тоже работает. 'Entry.objects.latest ('id')' – Renyi

+4

Это опрятный способ сделать это. Также: «Если Meta вашей модели задает get_latest_by, вы можете оставить аргумент field_name последним()» в соответствии с документами. –

-4

Самый простой путь, не беспокоясь о текущем упорядоченности, чтобы преобразовать QuerySet к чтобы вы могли использовать обычную отрицательную индексацию Python. Как так:

list(User.objects.all())[-1] 
+1

Это запросит ВСЕ объекты из БД, а затем возьмет первый – warvariuc

+0

Хорошая точка! Очевидно, не думал об этом. Ответ .reverse() (выбранный сейчас) - это правильный путь! –

3

При использовании Джанго 1.6 и выше, его намного проще, как новый апи были введены -

Model.object.earliest() 

Это даст последний() с обратным направлением.

p.s. - Я знаю его старый вопрос, я отправляю, как будто идущий вперед, кто-то приземляется на этот вопрос, они узнают эту новую функцию, а не используют старый метод.

+3

из docs: earlyli() и last() требуют либо параметра field_name, либо get_latest_by в модели – panchicore

28

Django> = 1.6

методы Добавлена ​​QuerySet первый() и последняя(), которые являются удобные методы возвращающие первый или последний объект, соответствующий фильтры. Возвращает Нет, если нет соответствующих объектов.

3

Когда QuerySet уже исчерпан, вы можете сделать это, чтобы избежать еще дб подсказку -

last = queryset[len(queryset) - 1] if queryset else None 

Не используйте try...except....
Django не бросает IndexError в этом случае.
Он бросает AssertionError или ProgrammingError (при запуске питона с опцией -O)

20

Самый простой способ сделать это:

books.objects.all().last() 

Вы также можете использовать это, чтобы получить первую запись так:

books.objects.all().first() 
+1

Да, это работало гладко. – Jay

+4

'books.objects.last()' и 'books.objects.first()' должны делать трюк. – chandan

11

Чтобы получить первый объект:

ModelName.objects.first() 

Чтобы получить последние объекты:

ModelName.objects.last() 

Вы можете использовать фильтр

ModelName.objects.filter(name='simple').first() 

Это работает для меня.

Смежные вопросы