Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在同一个应用程序中使用django信号是否合适_Python_Django - Fatal编程技术网

Python 在同一个应用程序中使用django信号是否合适

Python 在同一个应用程序中使用django信号是否合适,python,django,Python,Django,正在尝试以尽可能干净的方式将电子邮件通知添加到我的应用程序中。当模型的某些字段发生更改时,应用程序应向用户发送通知。这是我以前的解决方案: from django.contrib.auth import User class MyModel(models.Model): user = models.ForeignKey(User) field_a = models.CharField() field_b = models.CharField() def sav

正在尝试以尽可能干净的方式将电子邮件通知添加到我的应用程序中。当模型的某些字段发生更改时,应用程序应向用户发送通知。这是我以前的解决方案:

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
的大小,并且可以单独启用/禁用它们。缺点是这种解决方案需要更多的代码和信号处理程序与模型本身分离,未知的读者可能会完全错过它们。同事们,你们觉得值得吗

我认为在这里使用信号是一个很好的设计决策。通知不是保存的一部分,它是保存的结果。处理这些类型的后果是Django提供信号的原因

我认为这是个好主意。来自最新Django Con的信息是一个关于Django中信号的可能和适当的资源