2008-10-10 7 views
14

J'ai les deux modèles suivants:Dans Django, comment informer un parent lorsqu'un enfant est enregistré dans une relation de clé étrangère?

class Activity(models.Model): 
    name = models.CharField(max_length=50, help_text='Some help.') 
    entity = models.ForeignKey(CancellationEntity) 
    ... 


class Cancellation(models.Model): 
    activity = models.ForeignKey(Activity) 
    date = models.DateField(default=datetime.now().date()) 
    description = models.CharField(max_length=250) 
    ... 

Je voudrais le modèle d'activité à prendre en compte lorsqu'une annulation est liée à celle enregistrée (à la fois inséré ou mis à jour).

Quelle est la meilleure façon de procéder?

Répondre

17

Qu'est-ce que vous voulez regarder dans est Django's signals (consultez this page aussi), en particulier les signaux de modèle - plus précisément, le signal post_save. Les signaux sont la version de Django d'un système plugin/hook. Le signal post_save est envoyé à chaque fois qu'un modèle est enregistré, qu'il soit mis à jour ou créé (et il vous indiquera s'il a été créé). Voici comment vous souhaitez utiliser des signaux pour être averti lorsqu'une activité a une annulation

from django.db.models.signals import post_save 

class Activity(models.Model): 
    name = models.CharField(max_length=50, help_text='Some help.') 
    entity = models.ForeignKey(CancellationEntity) 

    @classmethod 
    def cancellation_occurred (sender, instance, created, raw): 
     # grab the current instance of Activity 
     self = instance.activity_set.all()[0] 
     # do something 
    ... 


class Cancellation(models.Model): 
    activity = models.ForeignKey(Activity) 
    date = models.DateField(default=datetime.now().date()) 
    description = models.CharField(max_length=250) 
    ... 

post_save.connect(Activity.cancellation_occurred, sender=Cancellation)
+0

Votre méthode 'cancellation_occurred' devrait prendre' ** kargs'. par exemple 'cancel_occurred (expéditeur, instance, créé, raw, ** kargs.) Vous pouvez trouver ceci spécifié sur [signaux] (https://docs.djangoproject.com/fr/dev/topics/signals/#receiver -fonctions) page dans le deuxième/troisième paragraphe de _receiver functions_ – thomas

3

Quel est le problème avec ce qui suit?

class Cancellation(models.Model): 
    blah 
    blah 
    def save(self, **kw): 
     for a in self.activity_set.all(): 
      a.somethingChanged(self) 
     super(Cancellation, self).save(**kw) 

Cela vous permettrait de contrôler très précisément la notification parmi les modèles. D'une certaine manière, c'est le canonique "Pourquoi OO est-il si bon?" question. Je pense que OO est bon parce que votre collection d'objets Annulation et Activité peut coopérer pleinement.

+0

Considérant que «Activity» et «Cancellation» sont étroitement liés, je pense que c'est une meilleure solution. – muhuk

Questions connexes