Pertimbangkan model Django sederhana Eventdan Participant:
class Event(models.Model):
title = models.CharField(max_length=100)
class Participant(models.Model):
event = models.ForeignKey(Event, db_index=True)
is_paid = models.BooleanField(default=False, db_index=True)
Sangat mudah untuk membuat anotasi kueri acara dengan jumlah total peserta:
events = Event.objects.all().annotate(participants=models.Count('participant'))
Bagaimana cara membuat anotasi dengan jumlah peserta yang difilter is_paid=True?
Saya perlu menanyakan semua acara terlepas dari jumlah pesertanya, misalnya, saya tidak perlu memfilter berdasarkan hasil yang dianotasi. Kalau ada 0peserta tidak apa-apa, saya hanya perlu 0di annotated value.
The contoh dari dokumentasi tidak bekerja di sini, karena tidak termasuk benda dari query bukannya annotating mereka dengan 0.
Memperbarui. Django 1.8 mempunyai fitur ekspresi kondisional baru , jadi sekarang kita bisa melakukan seperti ini:
events = Event.objects.all().annotate(paid_participants=models.Sum(
models.Case(
models.When(participant__is_paid=True, then=1),
default=0,
output_field=models.IntegerField()
)))
Pembaruan 2. Django 2.0 mempunyai fitur agregasi Bersyarat baru , lihat jawaban yang diterima di bawah.
aggregatepenggunaan yang ditampilkan. Apakah Anda sudah menguji pertanyaan seperti itu? (Saya belum dan saya ingin percaya! :)