Pertimbangkan model Django sederhana Event
dan 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 0
peserta tidak apa-apa, saya hanya perlu 0
di 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.
aggregate
penggunaan yang ditampilkan. Apakah Anda sudah menguji pertanyaan seperti itu? (Saya belum dan saya ingin percaya! :)