2013-12-19 65 views
2

當我創建一個新的子網時,我正在使用信號來創建我的IP。如何在創建模型時運行方法?

但是#django中的一些人表示,更好的方法是創建自定義save()或讓表單處理它,如果有ForeingKey。

是否有比使用信號更合適的解決方案?如果有的話可以有人給我看一個代碼示例嗎?

我子網模型(models.py):

class Subnet(models.Model): 
    network_address = models.IPAddressField() 
    subnet_prefix = models.ForeignKey(SubnetPrefix) 

我的IP地址模型(models.py):

class IPAddress(models.Model): 
    subnet = models.ForeignKey(Subnet) 
    ip_address = models.IPAddressField() 
    hostname = models.CharField(max_length=255, null=True, blank=True) 

我的信號(models.py):

def subnet_post_save(sender, instance, created, *args, **kwargs): 
     # If this is a new object create ip_addresses in IPAddress table 
     if created: 
      create_ip_addresses(instance) 
+0

我只是使用信號,如果你已經有他們的工作。他們唯一真正的缺點是他們比自定義保存稍微複雜一些。但是,「創造」論證涵蓋了一些不明確的情況,檢查一個PK沒有,而「原始」論據也很有用。 –

+0

我看到你已經接受了描述如何覆蓋'save'的答案。在大多數情況下,這種方法沒有什麼問題,但是我的答案對於理解那些並不是最佳選擇的相對晦澀的情況可能是有用的:http://stackoverflow.com/questions/20339562/save-the-user-from -one-model-to-the-model/20340365#20340365 –

+0

這是一個很好的迴應,讓我感覺在我的應用程序中使用post_save信號更好。謝謝你。 –

回答

3

您必須重寫save方法:

class Subnet(models.Model): 
    network_address = models.IPAddressField() 
    subnet_prefix = models.ForeignKey(SubnetPrefix) 

    def save(self, *args, **kwargs): 
     created = not self.pk 
     super(Subnet, self).save(*args, **kwargs) 
     if created: 
      create_ip_addresses(self) 
+0

使用重寫保存,我能夠判斷對象是新的還是正在更新?因爲我想創建對象創建的IP。 –

+2

在調用''super(..)。save(..)''之前,您必須檢查self.pk是否已設置。您可以在[documentation]中閱讀更多內容(https://docs.djangoproject.com/en/1.1/ref/models/instances/#how-django-knows-to-update-vs-insert)。 – niekas

+0

謝謝你,這是非常有益的。我沒有 –