Cố gắng thêm thông báo email vào ứng dụng của tôi theo cách sạch nhất có thể. Khi một số trường nhất định của mô hình thay đổi, ứng dụng sẽ gửi thông báo cho người dùng. Đây là giải pháp cũ của tôi:Là nó approproate nó sử dụng tín hiệu django trong cùng một ứng dụng
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)
này làm việc tốt trong khi tôi đã có một hoặc hai loại thông báo, nhưng sau đó chỉ cảm thấy sai lầm khi có quá nhiều mã trong phương pháp save()
tôi. Vì vậy, tôi đã thay đổi mã để báo hiệu dựa trên:
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")
Lợi ích là tôi có thể tách xử lý sự kiện vào mô-đun khác nhau, làm giảm kích thước của models.py
và tôi có thể kích hoạt/vô hiệu hóa chúng riêng rẽ. Nhược điểm là giải pháp này là nhiều mã và xử lý tín hiệu được tách ra từ mô hình chính nó và người đọc không biết có thể bỏ lỡ chúng hoàn toàn. Vì vậy, các đồng nghiệp, bạn có nghĩ rằng nó có giá trị không?