92 votes

Django - Redéfinir la méthode Model.create ()?

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?

174voto

Zach Points 4886

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)

24voto

Michael Bylstra Points 830

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.

3voto

Remplacer __init__() vous permettra d'exécuter du code lorsque le modèle est instancié. N'oubliez pas d'appeler les parents __init__() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X