Ich habe ein Modell
class ItemPrice( models.Model ):
price = models.DecimalField ( max_digits = 8, decimal_places=2 )
....
Ich habe dies versucht, um die Summe von price
in diesem Abfragesatz zu berechnen :
items = ItemPrice.objects.all().annotate(Sum('price'))
Was ist falsch an dieser Abfrage? oder gibt es eine andere Möglichkeit, die price
Spaltensumme zu berechnen ?
Ich weiß, dass dies mit der for-Schleife auf dem Abfragesatz möglich ist, aber ich brauche eine elegante Lösung.
Vielen Dank!
Antworten:
Sie suchen wahrscheinlich
aggregate
quelle
{'price__sum':1000}
. Kann float / integer mityourdict['price__sum']
Mit Anmerkungen wird den Ergebnissen ein Feld hinzugefügt:
Aggregate gibt ein Diktat mit dem angeforderten Ergebnis zurück:
quelle
Verwenden Sie
.aggregate(Sum('column'))['column__sum']
mein Beispiel untenquelle
Mit dem cProfile-Profiler finde ich, dass es in meiner Entwicklungsumgebung effizienter (schneller) ist, die Werte einer Liste zu summieren, als mit zu aggregieren
Sum()
. z.B:Ich habe dies in verschiedenen Kontexten getestet und es scheint, dass die Verwendung
aggregate
immer länger dauert, um das gleiche Ergebnis zu erzielen. Obwohl ich vermute, dass es speichertechnische Vorteile geben könnte, es zu verwenden, anstatt eine Liste zu summieren.quelle