2008-10-10 17 views
14

Tôi có hai mô hình sau:Ở Django, làm cách nào để thông báo cho phụ huynh khi một đứa trẻ được lưu trong mối quan hệ khóa ngoại?

class Activity(models.Model): 
    name = models.CharField(max_length=50, help_text='Some help.') 
    entity = models.ForeignKey(CancellationEntity) 
    ... 


class Cancellation(models.Model): 
    activity = models.ForeignKey(Activity) 
    date = models.DateField(default=datetime.now().date()) 
    description = models.CharField(max_length=250) 
    ... 

Tôi muốn mô hình Hoạt động phải nhận thức được khi một Hủy liên quan đến nó được lưu (cả chèn hoặc cập nhật).

Cách tốt nhất để giải quyết vấn đề này là gì?

Trả lời

17

Điều bạn muốn xem xét là Django's signals (hãy xem this page quá), cụ thể là tín hiệu mô hình - cụ thể hơn, tín hiệu post_save. Tín hiệu là phiên bản của hệ thống plugin/móc của Django. Các tín hiệu post_save được gửi mỗi khi một mô hình được lưu, cho dù nó được cập nhật hoặc tạo ra (và nó sẽ cho bạn biết nếu nó được tạo ra). Đây là cách bạn muốn sử dụng tín hiệu để nhận thông báo khi Hoạt động có Hủy bỏ

from django.db.models.signals import post_save 

class Activity(models.Model): 
    name = models.CharField(max_length=50, help_text='Some help.') 
    entity = models.ForeignKey(CancellationEntity) 

    @classmethod 
    def cancellation_occurred (sender, instance, created, raw): 
     # grab the current instance of Activity 
     self = instance.activity_set.all()[0] 
     # do something 
    ... 


class Cancellation(models.Model): 
    activity = models.ForeignKey(Activity) 
    date = models.DateField(default=datetime.now().date()) 
    description = models.CharField(max_length=250) 
    ... 

post_save.connect(Activity.cancellation_occurred, sender=Cancellation)
+0

Phương thức 'cancel_occurred' của bạn nên dùng' ** kargs'. ví dụ 'cancel_occurred (người gửi, cá thể, được tạo, thô, ** kargs'. Bạn có thể tìm thấy điều này được chỉ định trên [signal] (https://docs.djangoproject.com/en/dev/topics/signals/#receiver -functions) trang trong đoạn thứ hai/thứ ba của _receiver functions_ – thomas

3

Có vấn đề gì sau đây?

class Cancellation(models.Model): 
    blah 
    blah 
    def save(self, **kw): 
     for a in self.activity_set.all(): 
      a.somethingChanged(self) 
     super(Cancellation, self).save(**kw) 

Nó sẽ cho phép bạn kiểm soát thông báo giữa các mô hình rất chính xác. Theo một cách nào đó, đây là kinh điển "Tại sao OO lại tốt thế?" câu hỏi. Tôi nghĩ rằng OO là tốt chính xác bởi vì bộ sưu tập của bạn hủy bỏ và các đối tượng hoạt động có thể hợp tác đầy đủ.

+0

Xem xét 'Hoạt động' và 'Hủy bỏ' có liên quan chặt chẽ Tôi nghĩ rằng đây là một giải pháp tốt hơn. – muhuk

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