2017-04-11 3 views
1

Django 1.11アプリがあります。 pre_save信号の奇妙な問題を除いて、すべてうまくいっています。私のモデルでは、問題のモデル(帯域幅とライセンス)の合計コストを計算するために使用する2つの多対多フィールドがあります。Djangoのpre_save信号は、adminから2回保存する必要があります。

これを達成するためにpre_save信号を作成しましたが、それは機能しますが、管理者からSkuコストの2倍の「保存」オプションを正しくクリックする必要があります。

下記のコードスニペット。探してくれてありがとう。

注:私は保存オーバーライドとしてこれをやってみました。結果は同じです.Djangoの管理者や私がやっていることに問題があるかどうかは分かりません。

class Sku(models.Model): 
    name = models.CharField(max_length=50) 
    bandwidth = models.ManyToManyField(Bandwidth, blank=True, null=True) 
    license = models.ManyToManyField(License, blank=True, null=True) 
    customer = models.ForeignKey(Customer, null=True, blank=True, related_name='sku') 
    cost = models.DecimalField(max_digits=25, decimal_places=2, default=0.00) 

    def list_bandwidth(self): 
     return ', '.join([ b.vendor for b in self.bandwidth.all()[:3]]) 

    def list_license(self): 
     return ', '.join([ b.name for b in self.license.all()[:3]]) 

    def __unicode__(self): 
     return self.name 


def sku_receiver_function(sender, instance, *args, **kwargs): 
    if instance.id: 
     bandwidth_cost = 0 
     license_cost = 0 

     if instance.bandwidth: 
      for b in instance.bandwidth.all(): 
       bandwidth_cost = float(b.cost) + bandwidth_cost 

     if instance.license: 
      for l in instance.license.all(): 
       license_cost = float(l.cost) + license_cost 

     instance.cost = bandwidth_cost + license_cost 

pre_save.connect(sku_receiver_function, sender=Sku) 
+1

adminで1回保存した後、値が正しく更新されていれば(シェルを使用しているとき)、djangoシェルをチェックしましたか? – Algorithmatic

+0

私はそうしました。ロジックの前後に印刷し、保存をクリックすると古い値が印刷されます。 – dhwillie

答えて

1

私は条件ので、その後、残りのコードを実行していない、このコードを実行する際に初めてインスタンスはIDを持っていないため、エラーがpre_save信号の最初の行にあることを考えます偽ですが、最終的に、これはidをinstanceにインスタンス化して保存し、次に2番目のインスタンスを保存します。インスタンスにidがあり、条件がtrueです。 pre_saveをpost_saveで変更すると、コードは正常に動作します。

私の英語のために申し訳ありません。

+0

if instance.idロジックを削除して同じ結果を得ましたが、post saveでこれを試して戻ってきます。ありがとう! – dhwillie

関連する問題