Django QuerySet
memiliki dua metode, annotate
dan aggregate
. Dokumentasi mengatakan bahwa:
Tidak seperti aggregate (), annotate () bukanlah klausa terminal. Output dari klausa annotate () adalah QuerySet.
Apakah ada perbedaan lain di antara keduanya? Jika tidak, lalu mengapa aggregate
ada?
django
django-queryset
Alexander Artemenko
sumber
sumber
.annotate()
pada qs saja tidak mengenai db, tetapi pemanggilanq[0].num_authors
tidak? Saya berasumsiaggregate
harus selalu menekan db karena itu adalah klausa terminal?connection.queries
. Petunjuk: periksa apakahbook = q[0]
atau `book.num_authors` yang menyebabkan kueri.Itulah perbedaan utamanya, tetapi agregat juga bekerja dalam skala yang lebih besar daripada anotasi. Anotasi secara inheren terkait dengan item individual dalam queryset. Jika Anda menjalankan
Count
anotasi pada sesuatu seperti bidang banyak-ke-banyak, Anda akan mendapatkan jumlah terpisah untuk setiap anggota set kueri (sebagai atribut tambahan). Jika Anda melakukan hal yang sama dengan agregasi, bagaimanapun, itu akan mencoba menghitung setiap hubungan pada setiap anggota queryset, bahkan duplikat, dan mengembalikannya hanya sebagai satu nilai.sumber
.annotate()
pada qs saja tidak mengenai db, tetapi memanggil hasil anotasi sepertiq[0].num_authors
itu? Saya berasumsiaggregate
harus selalu menekan db karena itu adalah klausa terminal?Agregat Agregat menghasilkan nilai hasil (ringkasan) di seluruh QuerySet. Agregat beroperasi melalui kumpulan baris untuk mendapatkan nilai tunggal dari kumpulan baris. (Misalnya jumlah semua harga di kumpulan baris). Agregat diterapkan di seluruh QuerySet dan menghasilkan nilai hasil (ringkasan) di seluruh QuerySet.
Dalam Model:
Di Shell:
Annotate Annotate menghasilkan ringkasan independen untuk setiap objek dalam QuerySet. (Kita dapat mengatakan iterasi setiap objek dalam QuerySet dan menerapkan operasi)
Dalam Model:
Dalam penglihatan:
Dalam tampilan ini akan menghitung suka untuk setiap video
sumber
distinct=True
diperlukan dalam contoh terakhir?