Как я могу получить последнюю запись в определенном наборе запросов?
Ответы:
РЕДАКТИРОВАТЬ: теперь вам нужно использовать Entry.objects.latest('pub_date')
Вы можете просто сделать что-то подобное, используя reverse()
:
queryset.reverse()[0]
Также обратите внимание на это предупреждение из документации Django:
... обратите внимание, что
reverse()
обычно следует вызывать только QuerySet, который имеет определенный порядок (например, при запросе к модели, которая определяет порядок по умолчанию, или при использованииorder_by()
). Если такой порядок не определен для данногоQuerySet
объекта, его вызовreverse()
не имеет реального эффекта (порядок не был определен до вызоваreverse()
и останется неопределенным после).
latest(field_name=None)
возвращает последний объект в таблице по дате, используя field_name, указанное в качестве поля даты.В этом примере возвращается последняя запись в таблице в соответствии с
pub_date
полем:
Entry.objects.latest('pub_date')
Самый простой способ сделать это:
books.objects.all().last()
Вы также можете использовать это, чтобы получить первую запись следующим образом:
books.objects.all().first()
books.objects.last()
и books.objects.first()
должен сделать свое дело.
XYZ.objects.first()
and XYZ.objects.last()
Чтобы получить первый объект:
ModelName.objects.first()
Чтобы получить последние предметы:
ModelName.objects.last()
Вы можете использовать фильтр
ModelName.objects.filter(name='simple').first()
У меня это работает.
Когда набор запросов уже исчерпан, вы можете сделать это, чтобы избежать еще одной подсказки db -
last = queryset[len(queryset) - 1] if queryset else None
Не используйте try...except...
.
Django IndexError
в этом случае не бросает .
Он выдает AssertionError
или ProgrammingError
(при запуске python с параметром -O)
Если вы используете django 1.6 и выше, теперь это намного проще, поскольку был представлен новый api -
Model.object.earliest()
Он даст latest () с обратным направлением.
ps - Я знаю его старый вопрос, я публикую, как если бы кто-то столкнулся с этим вопросом, они узнали эту новую функцию и не использовали старый метод.
Вы можете использовать Model.objects.last()
или Model.objects.first()
. Если не ordering
определено, то набор запросов упорядочивается на основе первичного ключа. Если вам нужен набор запросов для упорядочивания поведения, вы можете обратиться к последним двум пунктам.
Если вы думаете сделать это, Model.objects.all().last()
получить последний и Model.objects.all().first()
получить первый элемент в наборе запросов или использовать filters
без раздумий. Тогда ознакомьтесь с некоторыми предостережениями ниже.
Здесь важно отметить, что если вы не включили ничего ordering
в свою модель, данные могут быть в любом порядке, и у вас будет случайный последний или первый элемент, чего не ожидалось.
Например. Допустим, у вас есть модель Model1
с 2 столбцами id
и item_count
10 строками с идентификаторами от 1 до 10. [Порядок не определен]
Если вы получите Model.objects.all (). Last () таким образом, вы можете получить любой элемент из списка из 10 элементов. Да, это случайно, так как нет порядка по умолчанию.
Так что же можно сделать?
ordering
на основе любого поля или полей вашей модели. У него также есть проблемы с производительностью, пожалуйста, проверьте это тоже. Ссылка: Здесьorder_by
при загрузке. Как это:Model.objects.order_by('item_count').last()
Самый простой способ, не беспокоясь о текущем порядке, - это преобразовать QuerySet в список, чтобы вы могли использовать обычную отрицательную индексацию Python. Вот так:
list(User.objects.all())[-1]