获得Django 1.11应用程序。一切都运行正常,除了pre_save信号的奇怪问题。在我的模型中,我有两个多对多的字段,我用它来计算模型中的总成本(带宽和许可证)。
我创建了一个pre_save信号来实现这一点,并且它可以工作,但是从管理员那里我必须点击" Save"选项两次,以便Sku成本正确更新。
下面的代码段。谢谢你的期待。
注意:我尝试将此作为保存覆盖并且结果相同,因此不确定它是否只是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)
答案 0 :(得分:1)
我认为错误在pre_save信号的第一行,因为第一次运行此代码时实例没有id,然后不执行其余的代码,因为条件是假的,但最后,这将id作为实例并保存,然后在第二个保存实例有id并且条件为真。 您可以通过post_save更改pre_save,代码可以正常工作。
抱歉我的英文。