Basit Django modellerini düşünün Event
ve 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)
Toplam katılımcı sayısı ile etkinlikler sorgusuna açıklama eklemek kolaydır:
events = Event.objects.all().annotate(participants=models.Count('participant'))
Filtrelenen katılımcı sayısı ile nasıl açıklama yapılır is_paid=True
?
Katılımcı sayısından bağımsız olarak tüm olayları sorgulamalıyım , örneğin açıklamalı sonuca göre filtrelememe gerek yok. 0
Katılımcı varsa , sorun değil, sadece 0
açıklamalı değere ihtiyacım var .
Belgelere örnek hariç tutan onları annotating yerine sorgudan nesneleri, çünkü burada çalışmıyor 0
.
Güncelleme. Django 1.8 yeni koşullu ifadeler özelliğine sahiptir , bu yüzden şimdi şöyle yapabiliriz:
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()
)))
Güncelleme 2. Django 2.0, yeni Koşullu toplama özelliğine sahiptir, aşağıdaki kabul edilen yanıta bakın.
aggregate
kullanım gösteriliyor. Bu tür sorguları zaten test ettiniz mi? (