2008-10-10 4 views
14

मैं निम्नलिखित दो मॉडल हैं:Django में जब मैं एक विदेशी कुंजी रिश्ते में एक बच्चा बचाया जाता है तो मैं माता-पिता को कैसे सूचित करूं?

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

मैं जब यह करने के लिए संबंधित एक रद्द सहेजा जाता है (दोनों डाला जाता है या अद्यतन) गतिविधि मॉडल बारे में पता होना चाहते हैं।

इस बारे में जाने का सबसे अच्छा तरीका क्या है?

उत्तर

17

क्या आप इस पर गौर करना चाहते हैं Django's signals (बाहर this page भी जांच) है, विशेष रूप से मॉडल संकेत - अधिक विशेष रूप से, post_save संकेत। प्लगइन/हुक प्रणाली के Django के संस्करण सिग्नल हैं। जब भी मॉडल सहेजा जाता है, पोस्ट-सेव सिग्नल भेजा जाता है, चाहे वह अपडेट हो या बनाया गया हो (और यह आपको बताएगा कि यह बनाया गया था)। इस तरह आप संकेतों का उपयोग करेंगे एक गतिविधि एक रद्द

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

आपकी 'रद्दीकरण_कॉर्क्ड' विधि को '** करग 'लेना चाहिए। उदाहरण के लिए 'रद्दीकरण_कॉर्क्ड (प्रेषक, उदाहरण, बनाया गया, कच्चा, ** कार्ग'। आप इसे [सिग्नल] पर निर्दिष्ट कर सकते हैं (https://docs.djangoproject.com/en/dev/topics/signals/#receiver -फंक्शन) _receiver functions_ – thomas

3

क्या निम्नलिखित साथ कुछ गड़बड़ है जब सूचना पाने के लिए है?

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) 

यह आपको मॉडलों के बीच अधिसूचना को बहुत सटीक रूप से नियंत्रित करने की अनुमति देगा। एक तरह से, यह कैननिकल है "ओओ इतना अच्छा क्यों है?" सवाल। मुझे लगता है कि ओओ ठीक है क्योंकि रद्दीकरण और गतिविधि वस्तुओं का संग्रह पूरी तरह से सहयोग कर सकता है।

+0

के दूसरे/तीसरे पैराग्राफ में पृष्ठ 'गतिविधि' और 'रद्दीकरण' को ध्यान में रखते हुए मुझे लगता है कि यह एक बेहतर समाधान है। – muhuk

संबंधित मुद्दे