Получить последнюю запись в queryset
Как я могу получить последнюю запись в определенном наборе запросов?
8 ответов
вы можете просто сделать что-то вроде этого, используя reverse()
:
queryset.reverse()[0]
кроме того, остерегайтесь этого предупреждения из документации Django:
... обратите внимание, что
reverse()
должны обычно вызывается только в QuerySet который имеет определенный порядок (например ,, при запросе модели, которая определяет порядок по умолчанию, или когда используяorder_by()
). Если нет такого заказа определяется для заданногоQuerySet
, зовуreverse()
на нем нет реальных эффект (порядок не определен до вызоваreverse()
, и после этого оставайтесь неопределенными).
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]