Получите последнюю запись с фильтром в 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, как упоминалось здесь .

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

obj= Model.objects.filter(testfield=12).order_by('-id')[:1] правильное решение

Томас Джон
источник