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)
adminで1回保存した後、値が正しく更新されていれば(シェルを使用しているとき)、djangoシェルをチェックしましたか? – Algorithmatic
私はそうしました。ロジックの前後に印刷し、保存をクリックすると古い値が印刷されます。 – dhwillie