2011-11-17 11 views
6

Voglio eseguire del codice in un modello Django quando viene creato per la prima volta. Dopodiché ogni volta che viene salvato voglio eseguire qualche altro codice. La seconda attività può essere facilmente eseguita sovrascrivendo il metodo save(). Come posso fare il primo compito?Esegui codice sulla creazione del modello in Django

risposta

9

È possibile utilizzare django signals '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

ho provato questo, ma è stato sempre un errore. Ho scoperto che sto usando la versione di Django (1, 1, 1, 'final', 0) e funziona solo con Django 1.3 e successivi. Proverò ad aggiornare ma conosci qualche altro metodo? Grazie! –

+0

@Rohit: qual è stato l'errore in 1.1.1? Questi segnali esistevano in 1.1.1, l'installazione potrebbe essere leggermente diversa, o ho un refuso. – sdolan

+1

@RohitAgarwal: ho dato uno sguardo ai vecchi documenti e aggiornato il fondo del mio esempio di cosa dovrebbe funzionare per 1.1.1. – sdolan

21

Estendere sdolan' s answer utilizzando receiver decoratore:

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

Questo è ciò che funziona ora con django 1.10, piuttosto che la risposta accettata che era presumibilmente corretta per le versioni precedenti. – LisaD