Saya ingin mengambil 10 contoh terakhir dari model dan memiliki kode ini:
Model.objects.all().order_by('-id')[:10]
Benarkah yang pertama mengambil semua contoh, dan kemudian hanya mengambil 10 yang terakhir? Apakah ada metode yang lebih efektif?
Jawaban:
Kuartet Django malas. Itu berarti permintaan akan mengenai database hanya ketika Anda secara spesifik meminta hasilnya.
Jadi sampai Anda mencetak atau benar-benar menggunakan hasil kueri, Anda dapat memfilter lebih jauh tanpa akses database.
Seperti yang Anda lihat di bawah, kode Anda hanya menjalankan satu kueri sql untuk mengambil hanya 10 item terakhir.
sumber
Sebenarnya saya pikir
LIMIT 10
akan dikeluarkan ke basis data sehingga mengiris tidak akan terjadi di Python tetapi dalam database.Lihat limiting-querysets untuk informasi lebih lanjut.
sumber
Sepertinya solusi dalam pertanyaan tidak lagi berfungsi dengan Django 1.7 dan menimbulkan kesalahan: "Tidak dapat memesan ulang permintaan setelah potongan diambil"
Menurut dokumentasi https://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets yang memaksa parameter “step” dari sintaks iris slice Python mengevaluasi Query. Cara kerjanya seperti ini:
Masih saya bertanya-tanya apakah batas dijalankan dalam SQL atau Python iris seluruh hasil array dikembalikan. Tidak ada gunanya mengambil daftar besar ke memori aplikasi.
sumber
Iya. Jika Anda ingin mengambil subset objek terbatas, Anda bisa dengan kode di bawah ini:
Contoh:
Awal 0 adalah opsional, jadi
Kode di atas mengembalikan 10 instance pertama.
sumber
Sebagai tambahan dan pengamatan terhadap jawaban-jawaban lain yang bermanfaat, perlu diperhatikan bahwa melakukan
[:10]
slicing akan mengembalikan 10 elemen pertama dari daftar , bukan 10 yang terakhir ...Untuk mendapatkan 10 terakhir yang harus Anda lakukan
[-10:]
sebagai gantinya (lihat di sini ). Ini akan membantu Anda menghindari penggunaanorder_by('-id')
dengan-
untuk membalikkan elemen.sumber
Product.objects.filter(~Q(price=0))[-5:]
menyebabkan saya kesalahan yang sama: "Pengindeksan negatif tidak didukung."