2010-04-16 14 views
8

के भीतर django सिग्नल का उपयोग करने के लिए उपयुक्त है, जो संभवतः सबसे साफ तरीके से मेरे ऐप में ईमेल अधिसूचना जोड़ने की कोशिश कर रहा है। जब मॉडल के कुछ फ़ील्ड बदलते हैं, तो ऐप को किसी उपयोगकर्ता को अधिसूचना भेजनी चाहिए। यहाँ मेरे पुराने समाधान है:क्या यह एक ही ऐप

from django.contrib.auth import User 

class MyModel(models.Model): 
    user = models.ForeignKey(User) 
    field_a = models.CharField() 
    field_b = models.CharField() 

    def save(self, *args, **kwargs): 
     old = self.__class__.objects.get(pk=self.pk) if self.pk else None 
     super(MyModel, self).save(*args, **kwargs) 
     if old and old.field_b != self.field_b: 
      self.notify("b-changed") 
     # Sevelar more events here 
     # ... 

    def notify(self, event) 
     subj, text = self._prepare_notification(event) 
     send_mail(subj, body, settings.DEFAULT_FROM_EMAIL, [self.user.email], fail_silently=True) 

यह जब तक मैं एक या दो अधिसूचना प्रकार था ठीक काम किया, लेकिन बाद कि बस अपना save() विधि में इतना कोड के लिए गलत महसूस किया। तो, मैं करने के लिए कोड बदल संकेत आधारित:

from django.db.models import signals 

def remember_old(sender, instance, **kwargs): 
    """pre_save hanlder to save clean copy of original record into `old` attribute 
    """ 
    instance.old = None 
    if instance.pk: 
     try: 
      instance.old = sender.objects.get(pk=instance.pk) 
     except ObjectDoesNotExist: 
      pass 

def on_mymodel_save(sender, instance, created, **kwargs): 
    old = instance.old 
    if old and old.field_b != instance.field_b: 
     self.notify("b-changed") 
    # Sevelar more events here 
    # ... 

signals.pre_save.connect(remember_old, sender=MyModel, dispatch_uid="mymodel-remember-old") 
signals.post_save.connect(on_mymodel_save, sender=MyModel, dispatch_uid="mymodel-on-save") 

लाभ यह है कि मैं अलग मॉड्यूल में ईवेंट हैंडलर्स अलग कर सकते हैं, models.py के आकार को कम और मैं सक्षम/उन्हें व्यक्तिगत रूप से अक्षम कर सकते है। नकारात्मकता यह है कि यह समाधान अधिक कोड है और सिग्नल हैंडलर मॉडल से अलग होते हैं और अनजान पाठक उन्हें पूरी तरह से याद कर सकते हैं। तो, सहयोगियों, क्या आपको लगता है कि यह इसके लायक है?

उत्तर

4

मुझे लगता है कि यह एक अच्छा विचार है। सबसे हालिया DjangoCon से "Custom Signals for Uncoupled Design" talk जो Django में संकेतों के साथ संभव और उपयुक्त है का एक बड़ा संसाधन है।

3

मुझे लगता है कि सिग्नल का उपयोग करना एक अच्छा डिजाइन निर्णय है। अधिसूचना सहेजने का हिस्सा नहीं है, यह सहेजने का एक परिणाम है। इस तरह के परिणामों से निपटने का कारण है Django सिग्नल प्रदान करता है।

संबंधित मुद्दे