Les documents Django ne répertorient que des exemples pour remplacer save()
et delete()
. Toutefois, j'aimerais définir un traitement supplémentaire pour mes modèles uniquement lorsqu'ils sont créés . Pour ceux qui sont familiers avec Rails, cela équivaudrait à créer un filtre :before_create
. Est-ce possible?
Réponses
Trop de publicités?Primordial __init__()
serait de provoquer l'exécution de code à chaque fois que le python de la représentation de l'objet est instancié. Je ne sais pas les rails, mais un :before_created
filtre me semble que c'est un code à exécuter lorsque l'objet est créé dans la base de données. Si vous souhaitez exécuter du code lorsqu'un nouvel objet est créé dans la base de données, vous devez remplacer save()
, de vérifier si l'objet a un pk
d'attribut ou pas. Le code devrait ressembler à quelque chose comme ceci:
def save(self, *args, **kwargs):
if not self.pk:
#This code only happens if the objects is
#not in the database yet. Otherwise it would
#have pk
super(MyModel, self).save(*args, **kwargs)
un exemple de comment créer un post_save signal (à partir de http://djangosnippets.org/snippets/500/)
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
"""Create a matching profile whenever a user object is created."""
if created:
profile, new = UserProfile.objects.get_or_create(user=instance)
voici une discussion réfléchie de savoir s'il est préférable d'utiliser des signaux personnalisés ou enregistrer des méthodes http://www.martin-geber.com/thought/2007/10/29/django-signals-vs-custom-save-method/
À mon avis, à l'aide de signaux pour cette tâche est plus robuste, plus facile à lire, mais plus long.