EDIT: Anda sekarang harus menggunakan Entry.objects.latest('pub_date')
Anda bisa melakukan sesuatu seperti ini, menggunakan reverse()
:
queryset.reverse()[0]
Juga, waspadalah peringatan ini dari dokumentasi Django:
... perhatikan bahwa reverse()
umumnya hanya dipanggil pada QuerySet yang memiliki pengurutan yang ditentukan (misalnya, saat melakukan kueri terhadap model yang menentukan pengurutan default, atau saat menggunakan order_by()
). Jika tidak ada urutan seperti itu yang didefinisikan untuk suatu pemberian QuerySet
, memanggilnya reverse()
tidak memiliki efek nyata (urutannya tidak ditentukan sebelum panggilan reverse()
, dan akan tetap tidak ditentukan sesudahnya).
Django Doc :
sumber
Cara termudah untuk melakukannya adalah:
books.objects.all().last()
Anda juga menggunakan ini untuk mendapatkan entri pertama seperti:
books.objects.all().first()
sumber
books.objects.last()
danbooks.objects.first()
harus melakukan triknya.XYZ.objects.first()
danXYZ.objects.last()
Django> = 1,6
Menambahkan metode QuerySet first () dan last () yang merupakan metode praktis yang mengembalikan objek pertama atau terakhir yang cocok dengan filter. Mengembalikan Tidak Ada jika tidak ada objek yang cocok.
sumber
Untuk mendapatkan objek pertama:
ModelName.objects.first()
Untuk mendapatkan objek terakhir:
ModelName.objects.last()
Anda bisa menggunakan filter
ModelName.objects.filter(name='simple').first()
Ini berhasil untuk saya.
sumber
Saat queryset sudah habis, Anda dapat melakukan ini untuk menghindari petunjuk db lain -
last = queryset[len(queryset) - 1] if queryset else None
Jangan gunakan
try...except...
.Django tidak melempar
IndexError
dalam kasus ini.Itu melempar
AssertionError
atauProgrammingError
(ketika Anda menjalankan python dengan opsi -O)sumber
Jika menggunakan django 1.6 dan yang lebih baru, itu jauh lebih mudah sekarang karena api baru telah diperkenalkan -
Model.object.earliest()
Ini akan memberikan latest () dengan arah sebaliknya.
ps - Saya tahu pertanyaan lamanya, saya memposting seolah-olah maju seseorang mendarat pada pertanyaan ini, mereka mengetahui fitur baru ini dan akhirnya tidak menggunakan metode lama.
sumber
Anda dapat menggunakan
Model.objects.last()
atauModel.objects.first()
. Jika tidakordering
yang ditentukan maka queryset diurutkan berdasarkan kunci utama. Jika Anda ingin memesan perilaku queryset maka Anda dapat merujuk ke dua poin terakhir.Jika Anda berpikir untuk melakukan ini,
Model.objects.all().last()
untuk mengambilModel.objects.all().first()
elemen terakhir dan mengambil elemen pertama dalam queryset atau menggunakanfilters
tanpa berpikir dua kali. Kemudian lihat beberapa peringatan di bawah.Bagian penting yang perlu diperhatikan di sini adalah jika Anda belum menyertakannya
ordering
dalam model Anda, data dapat disusun dalam urutan apa pun dan Anda akan memiliki elemen terakhir atau pertama acak yang tidak diharapkan.Misalnya. Misalkan Anda memiliki model bernama
Model1
yang memiliki 2 kolomid
danitem_count
10 baris memiliki id 1 sampai 10. [Tidak ada urutan yang ditentukan]Jika Anda mengambil Model.objects.all (). Last () seperti ini, Anda bisa mendapatkan elemen apa pun dari daftar 10 elemen. Ya, Ini acak karena tidak ada pemesanan default.
Jadi apa yang bisa dilakukan?
ordering
berdasarkan bidang atau bidang apa pun pada model Anda. Ini memiliki masalah kinerja juga, Harap periksa juga. Ref: Di siniorder_by
saat mengambil. Seperti ini:Model.objects.order_by('item_count').last()
sumber
Cara termudah, tanpa harus mengkhawatirkan urutan saat ini, adalah dengan mengubah QuerySet menjadi daftar sehingga Anda dapat menggunakan pengindeksan negatif normal Python. Seperti:
list(User.objects.all())[-1]
sumber