2011-11-17 2 views
6

Je veux exécuter du code dans un modèle Django lors de sa première création. Après cela, chaque fois qu'il est sauvegardé, je veux exécuter un autre code. La deuxième tâche peut être facilement effectuée en remplaçant la méthode save(). Comment puis-je faire la première tâche?Exécuter du code sur la création de modèle dans Django

Répondre

9

Vous pouvez utiliser 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

J'ai essayé mais devenais une erreur. Il s'est avéré que j'utilise Django version (1, 1, 1, 'final', 0) et cela ne fonctionne que pour Django 1.3 et supérieur. Je vais essayer de mettre à niveau mais connaissez-vous une autre méthode? Merci! –

+0

@Rohit: Quelle était l'erreur dans 1.1.1? Ces signaux existaient en 1.1.1, la configuration peut être un peu différente, ou j'ai une faute de frappe. – sdolan

+1

@RohitAgarwal: J'ai regardé les anciens docs et mis à jour le bas de mon exemple de ce qui devrait fonctionner pour 1.1.1. – sdolan

21

Extension sdolan' s answer en utilisant receiver décorateur:

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

C'est ce qui fonctionne maintenant avec django 1.10, plutôt que la réponse acceptée qui était probablement correcte pour les versions antérieures. – LisaD

Questions connexes