gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:01:53 25 4
gpt4 key购买 nike

尝试以最简洁的方式向我的应用程序添加电子邮件通知。当模型的某些字段发生变化时,应用程序应向用户发送通知。这是我的旧解决方案:

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 的大小,并且我可以单独启用/禁用它们。缺点是这个解决方案是更多的代码和信号处理程序与模型本身分开,不知情的读者可能会完全错过它们。那么小伙伴们,你们觉得值得吗?

最佳答案

我认为这是个好主意。 "Custom Signals for Uncoupled Design" talk来自最近的 DjangoCon 是关于 Django 中信号的可能性和适用性的重要资源。

关于python - 在同一个应用程序中使用 django 信号是否合适,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2655226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com