Python 更改电子邮件地址时发送电子邮件

Python 更改电子邮件地址时发送电子邮件,python,django,Python,Django,在我的DJango应用程序中,我想实现一个系统,这样当我的jmodel中的email字段发生更改时,MyModel会向该电子邮件地址发送一封电子邮件。我有一个我这个模型的模型。我应该如何实现这一点 我是否应该覆盖ModelForm的save()方法并将电子邮件发送到那里 我是否应该试着捕捉某种型号的更新信号并将电子邮件发送到那里?如果是,如何发送?我应该捕捉什么信号 检查电子邮件是否已更改的好方法是什么。这本身是一件很容易实现的事情,但我希望代码能够驻留在正确的位置 谢谢 检查字段是否已更改:我

在我的DJango应用程序中,我想实现一个系统,这样当我的jmodel中的
email
字段发生更改时,
MyModel
会向该电子邮件地址发送一封电子邮件。我有一个我这个模型的模型。我应该如何实现这一点

  • 我是否应该覆盖ModelForm的
    save()
    方法并将电子邮件发送到那里
  • 我是否应该试着捕捉某种型号的更新信号并将电子邮件发送到那里?如果是,如何发送?我应该捕捉什么信号
  • 检查电子邮件是否已更改的好方法是什么。这本身是一件很容易实现的事情,但我希望代码能够驻留在正确的位置

    谢谢


    检查字段是否已更改:

    我不会按照参考SO问题的建议进行操作。它得到了18张赞成票,但似乎反对票并不是一切;)。事实上,它可能只是日期信息(2009)

    最好使用
    pre_save
    信号来执行此操作,这需要对您的模型进行绝对零的更改,因此不会产生任何负面后果,如您引用的答案

    本质上,在receiver方法中,您可以从数据库中查找实例对象。由于这是预保存,数据库尚未更改。因此,您可以将
    instance.some_field
    obj.some_field
    进行比较,看看它们是否不同

    @receiver(pre_save, sender=MyModel)
    def send_email_if_changed(sender, instance, **kwargs):
        try:
            obj = MyModel.objects.get(pk=instance.pk)
        except MyModel.DoesNotExist:
            pass # It's new, so email hasn't technically changed, but you might want to do something else here.
        else:
            if not obj.email == instance.email: # Email has changed
                # send email
    
    您可以使用来执行此操作,而无需额外的数据库查找:

    from django.db import models
    from django.dispatch import receiver
    from django_model_changes import ChangesMixin
    
    class MyModel(ChangesMixin, models.Model):
       # your model
    
    @receiver(pre_save, sender=MyModel)
    def send_email_if_changed(sender, instance, **kwargs):
        if 'email' in instance.changes():
            # send email
    

    选项1会将太多的行为耦合到模型中-发送电子邮件是该事件发生的副产品,但这不是模型需要了解的行为。您可以使用创建事件并设置此类行为的通知接收器。嗨,Chris,我正在实现这一点,但遇到了一个小问题。是否可以将电子邮件发送到新电子邮件地址,但不更新数据库中的电子邮件字段,即我想将旧电子邮件地址保存回数据库中。(我知道很多人不喜欢别人在评论中提问,但我觉得这与我一直试图实现的目标直接相关,因此我应该在这里提问。)谢谢克里斯。不,我认为这不可能。信号不会传回任何东西。他们只是根据自己的价值观做事。但是,你所描述的情况似乎是人为的。使用您实际试图完成的任务的信息修改您的问题。@MridangAgarwalla您可以调整我的答案以执行您想要的操作:覆盖
    save
    并调用self.changes()查看电子邮件是否更改,如果更改,您可以跳过调用
    super(MyModel,self).save()