Betrachten einfache Django Modelle Event
und Participant
:Wie filtert man Objekte für Count Annotation in Django?
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 Ereignisse Abfrage mit Gesamtzahl der Teilnehmer mit Anmerkungen versehen:
events = Event.objects.all().annotate(participants=models.Count('participant'))
Wie mit Anmerkungen versehen mit der Zählung der Teilnehmer durch is_paid=True
gefiltert?
Ich muss alle Ereignisse unabhängig von der Anzahl der Teilnehmer, z. Ich muss nicht nach annotierten Ergebnissen filtern. Wenn es 0
Teilnehmer gibt, ist das in Ordnung, ich brauche nur 0
in annotierten Wert.
Die example from documentation funktioniert hier nicht, da sie Objekte von Abfrage ausschließt, anstatt sie mit 0
zu kommentieren.
Aktualisierung. Django 1.8 hat neue conditional expressions feature, so jetzt wir so tun können:
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 neue Conditional aggregation Funktion hat, siehe the accepted answer unten.
Das sieht großartig aus! :) – rudyryk
BTW, es gibt kein solches Beispiel durch den Dokumentationslink, nur "aggregierte" Verwendung wird angezeigt. Haben Sie solche Anfragen bereits getestet? (Ich habe nicht und ich will es glauben! :) – rudyryk
Ich habe. Sie arbeiten. Ich traf tatsächlich einen seltsamen Patch, wo nach dem Upgrade auf Django 2.0 eine alte (super-komplizierte) Unterabfrage nicht mehr funktionierte und ich es durch eine sehr einfache gefilterte Zählung ersetzen konnte. Es gibt ein besseres in-doc-Beispiel für Anmerkungen, also werde ich das jetzt machen. – Oli