2009-06-10 12 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を行い、フォームを保存する - 私は前の合計をneの代わりに得るw合計、私が再び保存するときにのみ、全体が訂正されます。おそらく、Djangoが親オブジェクトと子オブジェクトを保存する方法が原因でしょうか?

私は(恐ろしいコードの準備)子順序オブジェクトにこの計算を動いていたとおもちゃその他のオプション:

注文(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() 

それはどちらかの非常に効果的ではないのですけれども。

誰かが、私がこれらの計算が確実に実行できるようにするための簡単な方法を教えてくれるのだろうか?シグナルの思考(私には比較的新しい)が、それが過度のものかどうか疑問に思った。私はおそらくこれを思っています!

答えて

4

別の考えでは、請求書の合計を明示的に保存しないことも考えてください。代わりに、請求書を照会するたびに動的に再計算されることがあります。

冗長で不整合なデータを避けるため、これはモデリングが優れていると思います。 SQLとDjangoは、必要なときにオーバーヘッドをかけずに請求書の合計を計算するのに十分なほどスマートです。 Esp。 aggregation function

+0

おそらく集計が最適ですが、集計はDjango 1.0では利用できませんが、集計では1.1が「今すぐ」になることに注意してください。 (tm)」 - SVNトランクは今使用するのに十分安定しています:) – mikl

+1

おめでとう集計は素晴らしいです。悲しいことに、私はDjango 1.0.2に悩まされていますが、あなたは私にアイディアをくれました - 私はプロパティ宣言でこれを解決しましたモデルのメソッドでは、フィールドに合計を明示的にコミットする必要はないことがわかりました - 完全に動作します。乾杯。 – user108791

0

ありがとう私は、フォームからの任意の変更されたオブジェクトはあなたを保存されていないかもしれないが、あなたのクエリは、データベースのようなオブジェクトを参照するので、あなたは、明示的に計算を行う前に子オブジェクトを保存する必要があります考えています。

関連する問題