2008-10-10 14 views
14

Ben şu iki model var:Django'da bir çocuk bir yabancı anahtar ilişkisinde kaydedildiğinde ebeveyn ne bildiririm?

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) 
    ... 

Ben bununla ilgili bir İptali (her ikisi eklenen veya güncellenen) kaydedildiğinde Etkinlik modeli farkında olmak istiyorum.

Bu konuda gitmenin en iyi yolu nedir?

cevap

17

Ne içine bakmak istiyorum Django's signals (çok this page kontrol) 'dir, özellikle modeli sinyalleri - daha spesifik olarak post_save sinyali. Sinyaller Django'nun bir eklenti/kanca sisteminin versiyonu. Post_save sinyali, güncellenmiş veya oluşturulmuş bir modelin her kaydedilişinde gönderilir (ve eğer oluşturulduğunu size bildirir). Bir Aktivasyon Varsa Sıfırla sinyalleri nasıl alırsınız Bildiri durumu

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

'cancellation_occurred' yönteminiz' ** kargs' olmalıdır. örneğin: cancellation_occurred (gönderen, örnek, oluşturulan, ham, ** kargs. Bunu belirtilen [sinyalleri] 'de bulabilirsiniz (https://docs.djangoproject.com/en/dev/topics/signals/#receiver -Functions) _receiver fonksiyonlarının ikinci/üçüncü paragraflarında_ sayfa – thomas

3

Aşağıdakilerden hangisi yanlıştır?

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) 

Modeller arasındaki bildirimi çok hassas bir şekilde kontrol etmenizi sağlar. Bir şekilde, bu kanonik "OO neden bu kadar iyi?" soru. Bence OO iyi bir şeydir, çünkü İptal ve Aktivite nesneleri koleksiyonunuz tamamen işbirliği yapabilir.

+0

'Aktivite' ve 'İptal' ile yakından ilişkilidir. Bunun daha iyi bir çözüm olduğunu düşünüyorum. – muhuk