2017-02-07 1 views
1

Ich habe ein Modell Order, das eine Eigenschaft hat, die order_total basierend auf OrderItem s durch Fremdschlüssel verknüpft berechnet.Berechnen Sie die Summe der Modelleigenschaften in Django

Ich möchte die Summe einer Anzahl von Order Instanzen 'order_total Eigenschaften berechnen.

Gibt es eine Möglichkeit, dies zu tun?

class Order(models.Model): 
    customer = models.ForeignKey(Customer) 
    placed = models.DateField() 

    ... 

    def get_total_cost(self): 
     return sum(item.get_cost() for item in self.items.all()) 

    order_total = property(get_total_cost) 


class OrderItem(models.Model): 
    order = models.ForeignKey(Order, related_name="items") 
    product = models.ForeignKey(Product, related_name="order_items") 
    quantity = models.PositiveIntegerField(default=1) 

    ... 

    def get_cost(self): 
     return self.product.price * self.quantity 

Dies ist meine Frage:

>>> Order.objects.all().aggregate(Sum("order_total")) 

Welche diesen Fehler zurückgibt:

django.core.exceptions.FieldError: Cannot resolve keyword 'order_total' into field. Choices are: placed, customer, customer_id, id, items, paid 
+2

diese Antwort suchen: http://stackoverflow.com/a/3066607/641249 Versuchen Sie stattdessen: https://docs.djangoproject.com/de/1.10/topics/db/aggregation/#aggregating-annotations – neverwalkaloner

Antwort

1

Sie müssen doppelt __ für Fremdschlüsselsuche von ORDER_TOTAL von OrderItem unterstreichen verwenden Modell mit Bestellung als Nachschlagefeld:

odrerObj = OrderItem.objects.all().aggregate(sum_order = Sum("order__order_total")) 

Aber wenn Sie Summe von Bestellen oject der ORDER_TOTAL Eigenschaft benötigen, können Sie so etwas wie dieses verwenden können:

order_list = Order.objects.all() 
sum = 0 
for item in order_list : 
    sum = sum + item.order_total() 

print sum 
+1

Vielen Dank, ich habe Ihre zweite Lösung verwendet. –

Verwandte Themen