Получить последнюю запись в queryset

Как я могу получить последнюю запись в определенном наборе запросов?

8 ответов


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

queryset.reverse()[0]

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

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


Django Doc:

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

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


в Django >= 1.6

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


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

books.objects.all().last()

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

books.objects.all().first()

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

ModelName.objects.first()

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

ModelName.objects.last()

вы можете использовать filter

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

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


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

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

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


Если вы используете django 1.6 и выше, теперь это намного проще, так как новый api был представлен -

Model.object.earliest()

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

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


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

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