2014-11-30 1 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) 

갱신 2

나는이 캐시 속성에 post_save하지만 최대 재귀 깊이 내가 @cached_property의 힌트를 발견
그들을 초과 돌아가 변경하려면 사용자 정의 세비 방법 사용 . 나는 가장 좋은 방법은 알고 있지만 일하는 것은 잘 모릅니다.

@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} 

이 코드는 테스트하지 않았지만 아이디어를 얻었습니다.