Dapatkan catatan terbaru dengan filter di Django

90

Saya mencoba untuk mendapatkan objek model Django terbaru tetapi tampaknya tidak berhasil.

Tak satu pun dari ini berfungsi:

obj = Model.objects.filter(testfield=12).latest()
obj = Model.objects.latest().filter(testfield=12)
doniyor
sumber
3
Sudahkah Anda mencoba:obj= Model.objects.filter(testfield=12).order_by('-id')[:1]
catherine
@catherine, bekerja seperti pesona! : D. Anda ingin menulis ini sebagai jawaban sehingga saya dapat memeriksanya?
doniyor
Di 2018 NewsPostImage.objects.filter(newsPostTarget=img_id).first(). Semoga membantu.
Ngatia Frankline

Jawaban:

101
obj= Model.objects.filter(testfield=12).order_by('-id')[0]
catherine
sumber
10
@Daveerwin itu tidak salah; Ada banyak cara untuk memecahkan masalah ini, dan jawaban ini dan yang lainnya benar.
Jordan
1
Perhatikan bahwa ini membuat asumsi bahwa id adalah bilangan bulat kunci primer yang diurutkan. Yang biasanya merupakan default untuk django, tetapi terkadang tidak.
dalore
2
Ini bisa berbahaya karena filter dapat mengembalikan daftar kosong
Kingston Chan
'-id' digunakan untuk membalik urutan!
Indra
3
mungkin .first () bukan [0]?
fevgenym
119

Lihat dokumen dari django: https://docs.djangoproject.com/en/dev/ref/models/querysets/#latest

Anda perlu menentukan bidang di latest (). misalnya.

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

Atau jika Meta model Anda menetapkan get_latest_by, Anda dapat meninggalkan field_nameargumen ke earliest() or latest(). Django akan menggunakan bidang yang ditentukan get_latest_bysecara baku.

Pranav Singh
sumber
2
Apakah "testfield" harus berupa field tanggal?
tani-rokk
25

terakhir () terbaru ()

Usign terakhir ():

ModelName.objects.last()

menggunakan latest ():

ModelName.objects.latest('id')
Subin Shrestha
sumber
17

latestbenar-benar dirancang untuk bekerja dengan bidang tanggal (mungkin juga berfungsi dengan jenis urutan total lainnya, tapi tidak yakin). Dan satu-satunya cara Anda dapat menggunakannya tanpa menentukan nama bidang adalah dengan menyetel get_latest_byatribut meta, seperti yang disebutkan di sini .

acjay.dll
sumber
8
Ini berfungsi dengan kunci primer, Anda selalu dapat melakukan sesuatu seperti ini:Model.objects.latest('id')
Ander
6

obj= Model.objects.filter(testfield=12).order_by('-id')[:1] adalah solusi yang tepat

Thomas John
sumber