Як я можу отримати останній запис у певному наборі запитів?
Відповіді:
EDIT: Тепер ви повинні використовувати Entry.objects.latest('pub_date')
Ви можете просто зробити щось подібне, використовуючи reverse()
:
queryset.reverse()[0]
Також остерігайтеся цього попередження з документації Django:
... зверніть увагу, що,
reverse()
як правило, слід викликати лише набір QuerySet, який має визначене впорядкування (наприклад, при запиті до моделі, яка визначає порядок за замовчуванням, або при використанніorder_by()
). Якщо для даного замовлення не визначено такого замовленняQuerySet
, закликreverse()
до нього не має реального ефекту (замовлення було невизначеним до викликуreverse()
та надалі залишатиметься невизначеним).
latest(field_name=None)
повертає останній об'єкт у таблиці за датою, використовуючи ім'я_поля, вказане як поле дати.Цей приклад повертає останній запис у таблиці відповідно до
pub_date
поля:
Entry.objects.latest('pub_date')
Найпростіший спосіб це зробити:
books.objects.all().last()
Ви також використовуєте це, щоб отримати перший запис так:
books.objects.all().first()
books.objects.last()
і books.objects.first()
повинен зробити трюк.
XYZ.objects.first()
і XYZ.objects.last()
Щоб отримати перший об'єкт:
ModelName.objects.first()
Щоб отримати останні об’єкти:
ModelName.objects.last()
Ви можете використовувати фільтр
ModelName.objects.filter(name='simple').first()
Це працює для мене.
Коли набір запитів вже вичерпаний, ви можете зробити це, щоб уникнути чергової підказки в базі даних -
last = queryset[len(queryset) - 1] if queryset else None
Не використовуйте try...except...
.
Django не кидає IndexError
в цьому випадку.
Викидає AssertionError
або ProgrammingError
(коли ви запускаєте python з опцією -O)
Якщо ви використовуєте django 1.6 і новіших версій, це стало набагато простіше тепер, коли був представлений новий api -
Model.object.earliest()
Це дасть останній () із зворотним напрямком.
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]