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)

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]

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



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 .


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.