Отримайте найновіший запис із фільтром у Django


90

Я намагаюся отримати найновіший об'єкт моделі Django, але, здається, не вдається.

Жодне з них не працює:

obj = Model.objects.filter(testfield=12).latest()
obj = Model.objects.latest().filter(testfield=12)

3
Ви пробували:obj= Model.objects.filter(testfield=12).order_by('-id')[:1]
Кетрін

@catherine, працює як шарм! : D. ви хочете написати це як відповідь, щоб я міг це перевірити?
доньйор

У 2018 році NewsPostImage.objects.filter(newsPostTarget=img_id).first(). Сподіваюся, це допоможе.
Ngatia Frankline

Відповіді:


101
obj= Model.objects.filter(testfield=12).order_by('-id')[0]

10
@DaveMerwin це не неправильно; існує кілька способів вирішення цієї проблеми, і ця відповідь, і інша є правильними.
Йорданія

1
Зауважте, це робить припущення, що id - це ціле число первинного ключа з послідовністю. Що зазвичай є типовим для django, але іноді ні.
dalore

2
Це може бути небезпечно, оскільки фільтр може повернути порожній список
Кінгстон Чан,

'-id' використовується, щоб змінити порядок!
Індра

3
може бути .first () замість [0]?
fevgenym

119

Перегляньте документи з django: https://docs.djangoproject.com/en/dev/ref/models/querysets/#latest

Вам потрібно вказати поле в останній (). напр.

obj= Model.objects.filter(testfield=12).latest('testfield')

Або якщо мета вашої моделі визначає get_latest_by, ви можете залишити field_nameаргумент до earliest() or latest(). Django використовуватиме поле, вказане get_latest_byза замовчуванням.


2
Чи має "тестове поле" бути полем дати?
tani-rokk


17

latestнасправді розроблений для роботи з полями дати (можливо, він працює і з іншими загальновпорядкованими типами, але не впевнений). І єдиний спосіб, яким ви можете використовувати його без зазначення назви поля, - це встановити get_latest_byмета-атрибут, як згадано тут .


8
Це працює з первинними ключами, ви завжди можете зробити щось подібне:Model.objects.latest('id')
Ander

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.