2010-04-16 31 views
8

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?

Trả lời

4

Tôi nghĩ đó là một ý tưởng hay. Các "Custom Signals for Uncoupled Design" talk từ DjangoCon gần đây nhất là một nguồn tài nguyên tuyệt vời của những gì có thể và thích hợp với các tín hiệu trong Django.

3

Tôi nghĩ rằng việc sử dụng tín hiệu ở đây là một quyết định thiết kế tốt. Thông báo không phải là một phần của lưu, đó là hậu quả của việc lưu. Đối phó với những loại hậu quả là lý do Django cung cấp tín hiệu.

Các vấn đề liên quan