2014-11-30 5 views
1

У меня есть этот код, но они не вычисляют текущий amout. Мне нужно сэкономить 2 раза для работы. Нам нужны даты на столе.Как рассчитать сумму многих из многих продуктов

класс меню есть:

product 
description 
price 

.

from django.db import models 
from django.utils.encoding import smart_unicode 
from menu.models import Menu 

class Order(models.Model): 
    date = models.DateTimeField(auto_now_add=True, null=True) 
    table = models.IntegerField(null=False, max_length=2,) 
    products = models.ManyToManyField(Menu,through='OrderProduct') 
    paid = models.BooleanField(default=False) 
    total = models.IntegerField(,default=0,editable=False,null=True) 

    def save(self, *args, **kwargs): 
     self.total = 0 
     for product in self.products.all(): 
      relationship_queryset = OrderProduct.objects.filter(order=self, product=product) 
      for p in relationship_queryset.all(): 
       self.total += p.total_products 
     super(Order, self).save(*args, **kwargs) 

    def __unicode__(self): 
     return smart_unicode(self.table) 

class OrderProduct(models.Model): 
    order = models.ForeignKey(Order) 
    product = models.ForeignKey(Menu) 
    num_products = models.IntegerField(max_length=2) 
    total_products = models.IntegerField(default=0,editable=False) 

    def save(self, *args, **kwargs): 
     self.total_products = (self.product.precio * self.num_products) 
     super(OrderProduct, self).save(*args, **kwargs) 

Update2

Я использую post_save но вернуть максимальной глубины рекурсии превысила
Их я нашел намек на @cached_property и изменить метод пользовательского Seve к этой кэшированных собственности , Я не знаю, это лучший способ сделать, но это workin.

@cached_property 
def total(self): 
    x = 0 
    for product in self.productos.all(): 
     relationship_queryset = OrderProduct.objects.filter(order=self, product=product) 
     for p in relationship_queryset.all(): 
      x += p.total_products 
    return x 
+0

В чем проблема? где вам нужна помощь? – doniyor

ответ

1

Использовать агрегацию. Вам не нужно сохранять общее значение в модели. Просто запрашивайте его каждый раз, когда вам это нужно. https://docs.djangoproject.com/en/dev/topics/db/aggregation/

>>> OrderProduct.objects.filter(product=product).aggregate(
... total=Sum(F('total_products'), output_field=IntegerField()) 
{'total': 123} 

Я не проверял этот код, но вы получите идею.

Смежные вопросы