2017-04-11 69 views
1

得到了Django 1.11應用程序。一切工作正常,除了pre_save信號的一個奇怪的問題。在我的模型中,我有兩個用於計算所討論模型(帶寬和許可證)的總成本的多對多領域。Django pre_save信號必須從管理員保存兩次才能生效

我創建了一個pre_save信號來完成這個任務,它可以工作,但是從管理員我不得不點擊兩次「保存」選項來更正Sku費用。

下面的代碼片段。感謝您的期待。

注意:我試着把它作爲一個保存重寫,結果是一樣的,所以不知道它是Django admin還是我正在做的事情。

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中進行一次保存後是否檢查了django shell,並且如果值更新正確(使用shell時)? – Algorithmatic

+0

我做到了,是的。在邏輯中和之後放置一個打印,點擊保存時會打印舊值。 – dhwillie

回答

1

我認爲錯誤是在pre_save信號的第一線,因爲第一次運行該代碼的實例沒有ID,然後不執行代碼的其餘部分時,因爲條件是錯誤的,但在最後,這將id賦值給實例並保存,然後在第二個保存實例中有id並且條件爲true。 您可以通過post_save更改pre_save,並且代碼可以正常工作。

對不起,我的英文。

+0

我做到了這一點,如果刪除了instance.id邏輯並得到了相同的結果,但會嘗試這個後保存和回來。謝謝! – dhwillie

相關問題