2013-12-19 36 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

谢谢你,这是非常有益的。我没有 –