Wie filtere ich Objekte in Django nach Count Annotation?
Betrachten Sie einfache Django-ModelleEvent
undParticipant
:
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)
Es ist einfach, die Ereignisabfrage mit der Gesamtzahl der Teilnehmer zu kommentieren:
events = Event.objects.all().annotate(participants=models.Count('participant'))
Wie kommentiere ich mit der Anzahl der nach @ gefilterten Teilnehmeis_paid=True
?
Ich muss @ abfragalle Veranstaltunge unabhängig von der Anzahl der Teilnehmer, z. Ich muss nicht nach kommentierten Ergebnissen filtern. Wenn es gibt0
Teilnehmer, das ist ok, ich brauche nur0
in kommentiertem Wert.
DasBeispiel aus der Dokumentation funktioniert hier nicht, weil es Objekte von der Abfrage ausschließt, anstatt sie mit @ zu kommentier0
.
Aktualisieren Django 1.8 hat ein neuesconditional expressions feature, also können wir das jetzt so machen:
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()
)))
Update 2. Django 2.0 hat neue Bedingte Aggregation Funktion, siehedie akzeptierte Antwort unten.