के भीतर 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
के आकार को कम और मैं सक्षम/उन्हें व्यक्तिगत रूप से अक्षम कर सकते है। नकारात्मकता यह है कि यह समाधान अधिक कोड है और सिग्नल हैंडलर मॉडल से अलग होते हैं और अनजान पाठक उन्हें पूरी तरह से याद कर सकते हैं। तो, सहयोगियों, क्या आपको लगता है कि यह इसके लायक है?