Django QuerySet
hat zwei Methoden, annotate
und aggregate
. Die Dokumentation sagt, dass:
Im Gegensatz zu aggregat () ist annotate () keine Terminalklausel. Die Ausgabe der annotate () -Klausel ist ein QuerySet.
Gibt es einen anderen Unterschied zwischen ihnen? Wenn nicht, warum aggregate
existiert es dann?
django
django-queryset
Alexander Artemenko
quelle
quelle
.annotate()
auf einem qs allein die Datenbank nicht getroffen wird, aber das Aufrufenq[0].num_authors
? Ich nehme anaggregate
muss immer die db treffen da es sich um eine terminalklausel handelt?connection.queries
. Hinweis: Überprüfen Sie, obbook = q[0]
die Abfrage durch "oder" book.num_authors "verursacht wird.Das ist der Hauptunterschied, aber Aggregate funktionieren auch in größerem Maßstab als Anmerkungen. Anmerkungen beziehen sich inhärent auf einzelne Elemente in einem Abfragesatz. Wenn Sie eine
Count
Annotation für ein Feld mit vielen zu vielen ausführen, erhalten Sie für jedes Mitglied des Abfragesatzes eine separate Anzahl (als zusätzliches Attribut). Wenn Sie jedoch dasselbe mit einer Aggregation tun würden, würde versucht, jede Beziehung auf jedem Mitglied des Abfragesatzes zu zählen, sogar Duplikate, und diese als nur einen Wert zurückzugeben.quelle
.annotate()
auf einem qs allein nicht die Datenbank getroffen wird, sondern das Ergebnis einer Annotation wieq[0].num_authors
folgt aufgerufen wird? Ich nehme anaggregate
muss immer die db treffen da es sich um eine terminalklausel handelt?Aggregat Aggregat generiert Ergebniswerte (Zusammenfassung) über ein gesamtes QuerySet. Aggregate arbeiten über das Rowset, um einen einzelnen Wert aus dem Rowset zu erhalten (z. B. Summe aller Preise im Rowset). Das Aggregat wird auf das gesamte QuerySet angewendet und generiert Ergebniswerte (Zusammenfassung) über das gesamte QuerySet.
Im Modell:
In Shell:
Annotate Annotate generiert eine unabhängige Zusammenfassung für jedes Objekt in einem QuerySet. (Wir können sagen, dass jedes Objekt in einem QuerySet iteriert und eine Operation angewendet wird.)
Im Modell:
Im Hinblick auf:
In der Ansicht werden die Likes für jedes Video gezählt
quelle
distinct=True
ist im letzten Beispiel erforderlich?