Django: Berechnen Sie die Summe der Spaltenwerte durch Abfrage

90

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 pricein 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 priceSpaltensumme 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!

Ahsan
quelle
Beantwortet das deine Frage? Django SUMME Abfrage?
Flimm

Antworten:

189

Sie suchen wahrscheinlich aggregate

from django.db.models import Sum

ItemPrice.objects.aggregate(Sum('price'))
# returns {'price__sum': 1000} for example
MattH
quelle
1
Wie kann ich die Gesamtzahl ermitteln, deren Preis = 5000 ist?
Anuj Sharma
6
Denken Sie daran, dass das Wörterbuch nicht float / integer zurückgibt, z {'price__sum':1000}. Kann float / integer mityourdict['price__sum']
Josh
31

Mit Anmerkungen wird den Ergebnissen ein Feld hinzugefügt:

>> Order.objects.annotate(total_price=Sum('price'))
<QuerySet [<Order: L-555>, <Order: L-222>]>

>> orders.first().total_price
Decimal('340.00')

Aggregate gibt ein Diktat mit dem angeforderten Ergebnis zurück:

>> Order.objects.aggregate(total_price=Sum('price'))
{'total_price': Decimal('1260.00')}
Ibrohim Ermatov
quelle
30

Verwenden Sie .aggregate(Sum('column'))['column__sum']mein Beispiel unten

sum = Sale.objects.filter(type='Flour').aggregate(Sum('column'))['column__sum']
ugali weich
quelle
4

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:

sum_a = sum([item.column for item in queryset]) # Definitely takes more memory.
sum_b = queryset.aggregate(Sum('column')).get('column__sum') # Takes about 20% more time.

Ich habe dies in verschiedenen Kontexten getestet und es scheint, dass die Verwendung aggregateimmer 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.

Onkel Saam
quelle