2009-06-10 2 views
1

주문 수량 및 주문 값 등을 보유한 여러 주문 하위가있는 인보이스 모델 객체에 대해 간단한 계산 범위를 수행해야합니다. 이는 모두 인보이스의 관리 양식을 통해 관리됩니다하위 개체에 대한 전체 계산을 수행하는 가장 쉬운 방법은 무엇입니까?

송장 (models.py) 자식 주문 수량을 변경할 때 몇 가지 문제가 발생

def save(): 
    #get the total of all associated orders 
    for order in self.invoice_orders.all(): 
    self.invoice_net_total += order.order_value 
    super(Invoice, self).save() 

과 :

코드) 인라인으로 지금 작업을하고있어이 같은이 CALCS을 수행 양식 저장하기 - 나는 네 대신 이전 합계를 얻는다. 전체, 다시 저장할 때만 총이 자체를 수정합니다. 아마 장고가 부모와 자식 객체를 저장하는 방식 때문에? 나는 아이의 순서 객체에이 계산을 움직이고 장난 삼아 생각해

다른 옵션 (끔찍한 코드를 준비) :

주문 (models.py)이 비록

def save(): 
    if not self.id: 
    self.invoice.invoice_net_total += self.order_value 
    elif self.id: 
    #grab old instance 
    old = Order.objects.get(pk=self.id) 
    #remove that old total 
    self.invoice.invoice_net_total -= old.order_value 
    self.invoice.save() 
    #add new total 
    self.invoice.invoice_net_value += self.order_value 
    self.invoice.save() 

역시 매우 효과적 아니다.

누가이 계산 결과를 제대로 수행 할 수있는 방법을 안내해 줄 수 있습니까? 신호 (나에게 비교적 새로운)의 생각 그러나 그것이 과잉 이었는지 궁금하게 생각했다. 나는 아마 이것을 overthinking 해요!

제게 당신의 쿼리가 데이터베이스로 개체를 참조하기 때문에 양식에서 변경된 객체를 저장되지 않았을 수도 있지만 명시 적으로, 계산을 수행하기 전에 자식 개체를 저장해야 생각하면

답변

4

다른 생각에 명시 적으로 송장 합계를 저장하지 마십시오. 대신 인보이스에 대해 쿼리 할 때마다 동적으로 다시 계산 될 수 있습니다.

중복되는 데이터와 일치하지 않는 데이터를 피하기 때문에 모델링이 더 좋습니다. SQL과 Django는 필요할 때마다 많은 오버 헤드없이 인보이스 합계를 계산할만큼 똑똑합니다. Esp. aggregation function

+0

아마도 집계가 가장 좋은 방법 일 수 있지만 집계는 장고 1.0에서는 가능하지 않지만 집계가있는 1.1은 "어느 날"에 나올 수 있다는 것을 알아 두십시오. (tm) "- SVN 트렁크가 현재 사용하기에 충분히 안정적입니다. – mikl

+1

감사 집계가 환상적입니다. Django 1.0.2가 붙어 있습니다.하지만 아이디어를 주셨습니다. 속성 선언으로 해결했습니다. 메서드를 사용하여 필드에 총계를 명시 적으로 적용 할 필요가 없음을 깨달았습니다. 완벽하게 작동합니다. 건배. – user108791

0

감사드립니다.

관련 문제