apa yang saya coba lakukan adalah ini:
dapatkan 30 Penulis dengan skor tertinggi (
Author.objects.order_by('-score')[:30]
)pesan penulis menurut
last_name
Ada saran?
python
django
django-models
RadiantHex
sumber
sumber
Jawaban:
Bagaimana dengan
Dalam Django 1.4 dan yang lebih baru Anda dapat memesan dengan menyediakan banyak bidang.
Referensi: https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by
order_by (* bidang)
Secara default, hasil yang dikembalikan oleh a
QuerySet
diurutkan oleh tupel pemesanan yang diberikan olehordering
opsi dalam model Meta. Anda dapat menimpa ini pada basis per-QuerySet dengan menggunakanorder_by
metode ini.Contoh:
Hasil di atas akan diurutkan dengan
score
turun, lalulast_name
naik. Tanda negatif di depan"-score"
menunjukkan urutan menurun. Urutan menaik tersirat.sumber
lambda x: x.last_name
? Lebih pendek, lebih bertele-tele dan tidak perlu diimpor.Saya hanya ingin mengilustrasikan bahwa solusi bawaan (hanya SQL) tidak selalu yang terbaik. Pada awalnya saya berpikir karena
QuerySet.objects.order_by
metode Django menerima banyak argumen, Anda dapat dengan mudah merangkainya:Tapi, itu tidak berfungsi seperti yang Anda harapkan. Contoh kasus, pertama adalah daftar presiden yang diurutkan berdasarkan skor (memilih 5 teratas agar lebih mudah dibaca):
Menggunakan solusi Alex Martelli yang secara akurat memberikan 5 orang teratas yang diurutkan berdasarkan
last_name
:Dan sekarang
order_by
panggilan gabungan :Seperti yang Anda lihat, ini adalah hasil yang sama dengan yang pertama, artinya tidak berfungsi seperti yang Anda harapkan.
sumber
Inilah cara yang memungkinkan ikatan untuk skor cut-off.
Anda bisa mendapatkan lebih dari 30 penulis di top_authors dengan cara ini dan
min(30,author_count)
apakah ada jika Anda memiliki kurang dari 30 penulis.sumber