Django pre_save信号必须从管理员保存两次才能生效

时间:2017-04-11 20:15:58

标签: python django django-models

获得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)

1 个答案:

答案 0 :(得分:1)

我认为错误在pre_save信号的第一行,因为第一次运行此代码时实例没有id,然后不执行其余的代码,因为条件是假的,但最后,这将id作为实例并保存,然后在第二个保存实例有id并且条件为真。 您可以通过post_save更改pre_save,代码可以正常工作。

抱歉我的英文。