Получите последнюю запись с фильтром в 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. Вы хотите написать это как ответ, чтобы я мог это проверить?
doniyor

В 2018 году NewsPostImage.objects.filter(newsPostTarget=img_id).first(). Надеюсь, это поможет.
Нгатия Франклин

Ответы:


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

10
@DaveMerwin, это не неправильно; существует несколько способов решения этой проблемы, и оба ответа верны.
Jordan

1
Обратите внимание, что здесь предполагается, что id является упорядоченным целым числом первичного ключа. Обычно это значение по умолчанию для django, но иногда нет.
dalore

2
Это может быть опасно, потому что фильтр может вернуть пустой список
Kingston Chan

'-id' используется для изменения порядка!
Indra

3
может быть .first () вместо [0]?
fevgenym

119

См. Документы от django: https://docs.djangoproject.com/en/dev/ref/models/querysets/#latest

Вам нужно указать поле в latest (). например.

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

Или, если Meta вашей модели указывает get_latest_by, вы можете оставить field_nameаргумент для earliest() or latest(). Django будет использовать поле, указанное get_latest_byпо умолчанию.


2
Обязательно ли "testfield" быть полем даты?
tani-rokk


17

latestдействительно предназначен для работы с полями даты (вероятно, он работает и с другими полностью упорядоченными типами, но не уверен). И единственный способ использовать его без указания имени поля - это установить get_latest_byатрибут meta, как упоминалось здесь .


8
Он действительно работает с первичными ключами, вы всегда можете сделать что-то вроде этого:Model.objects.latest('id')
Андер

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.