Bagaimana saya bisa mendapatkan kembali catatan terakhir dalam queryset tertentu?
Jawaban:
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 menggunakanorder_by()
). Jika tidak ada urutan seperti itu yang didefinisikan untuk suatu pemberianQuerySet
, memanggilnyareverse()
tidak memiliki efek nyata (urutannya tidak ditentukan sebelum panggilanreverse()
, dan akan tetap tidak ditentukan sesudahnya).
latest(field_name=None)
mengembalikan objek terbaru dalam tabel, berdasarkan tanggal, menggunakan field_name yang disediakan sebagai field tanggal.Contoh ini mengembalikan entri terbaru dalam tabel, menurut
pub_date
bidang:
Entry.objects.latest('pub_date')
Cara termudah untuk melakukannya adalah:
books.objects.all().last()
Anda juga menggunakan ini untuk mendapatkan entri pertama seperti:
books.objects.all().first()
books.objects.last()
dan books.objects.first()
harus melakukan triknya.
XYZ.objects.first()
dan XYZ.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.
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.
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
atau ProgrammingError
(ketika Anda menjalankan python dengan opsi -O)
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.
Anda dapat menggunakan Model.objects.last()
atau Model.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 mengambil Model.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 kolom id
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()
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]