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!


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

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')}

30

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

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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.