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.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage