Pobierz najnowszy rekord z filtrem w Django

90

Próbuję uzyskać najnowszy obiekt modelu Django, ale nie wydaje mi się, aby mi się udało.

Żadne z nich nie działa:

obj = Model.objects.filter(testfield=12).latest()
obj = Model.objects.latest().filter(testfield=12)
doniyor
źródło
3
Czy próbowałeś:obj= Model.objects.filter(testfield=12).order_by('-id')[:1]
catherine
@catherine, działa jak urok! :RE. chcesz napisać to jako odpowiedź, abym mógł to sprawdzić?
doniyor
W 2018r NewsPostImage.objects.filter(newsPostTarget=img_id).first(). Mam nadzieję, że to pomoże.
Ngatia Frankline

Odpowiedzi:

101
obj= Model.objects.filter(testfield=12).order_by('-id')[0]
Katarzyna
źródło
10
@DaveMerwin to nie jest niepoprawne; istnieje wiele sposobów rozwiązania tego problemu, a zarówno ta odpowiedź, jak i druga są poprawne.
Jordania
1
Zauważ, że zakłada się, że id jest sekwencyjną liczbą całkowitą klucza podstawowego. Co jest normalnie domyślne dla django, ale czasami nie.
dalore
2
Może to być niebezpieczne, ponieważ filtr może zwrócić pustą listę
Kingston Chan
'-id' służy do odwrócenia kolejności!
Indra
3
może .first () zamiast [0]?
fevgenym
119

Zobacz dokumentację z django: https://docs.djangoproject.com/en/dev/ref/models/querysets/#latest

Musisz określić pole w najnowszej (). na przykład.

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

Lub jeśli Meta twojego modelu określa get_latest_by, możesz zostawić field_nameargument na earliest() or latest(). Django get_latest_bydomyślnie użyje pola określonego w .

Pranav Singh
źródło
2
Czy „pole testowe” musi być polem daty?
tani-rokk
17

latestjest naprawdę zaprojektowany do pracy z polami daty (prawdopodobnie działa również z innymi typami uporządkowanymi łącznie, ale nie jestem pewien). Jedynym sposobem, w jaki możesz go używać bez określania nazwy pola, jest ustawienie get_latest_byatrybutu meta, jak wspomniano tutaj .

acjay
źródło
8
Działa z kluczami głównymi, zawsze możesz zrobić coś takiego:Model.objects.latest('id')
Ander
6

obj= Model.objects.filter(testfield=12).order_by('-id')[:1] to właściwe rozwiązanie

Thomas John
źródło