2011-11-17 55 views
6

我想在第一次创建时在Django模型中执行一些代码。之后,每当它被保存时,我想执行一些其他代码。通过重写save()方法可以轻松完成第二项任务。 我该怎么做第一项任务?在Django中创建模型时执行代码

回答

9

可以使用django signals:使用receiver装饰“post_save

# models.py 

from django.db.models import signals 

class MyModel(models.Model): 
    pass 

def my_model_post_save(sender, instance, created, *args, **kwargs): 
    """Argument explanation: 

     sender - The model class. (MyModel) 
     instance - The actual instance being saved. 
     created - Boolean; True if a new record was created. 

     *args, **kwargs - Capture the unneeded `raw` and `using`(1.3) arguments. 
    """ 
    if created: 
     # your code goes here 


# django 1.3+ 
from django.dispatch import dispatcher 
dispatcher.connect(my_model_post_save, signal=signals.post_save, sender=MyModel) 

# django <1.3 
from django.db.models.signals import post_save 
post_save.connect(my_model_post_save, sender=MyModel) 
+0

我试过,但得到了一个错误。原来我使用的是Django版本(1,1,1,'final',0),这只适用于Django 1.3及更高版本。我会尝试升级,但您是否知道其他方法?谢谢! –

+0

@Rohit:1.1.1中的错误是什么?这些信号存在于1.1.1中,设置可能有点不同,或者我有一个错字。 – sdolan

+1

@RohitAgarwal:我瞥了一眼以前的文档,并更新了我应该为1.1.1工作的例子的底部。 – sdolan

21

扩展sdolananswer

from django.db import models 
from django.dispatch import receiver 

class MyModel(models.Model): 
    pass 

@receiver(models.signals.post_save, sender=MyModel) 
def execute_after_save(sender, instance, created, *args, **kwargs): 
    if created: 
     # code 
+2

这是django 1.10现在的作品,而不是接受的答案,大概是早期版本的正确答案。 – LisaD