2009-08-03 16 views
9

इम कई "ग्राहकों" के लिए एक "सूचना" वस्तु कनेक्ट करने का प्रयास (नीचे कोड देखें)Django post_save सिग्नल मुझे pre_save डेटा क्यों देता है?

जब एक सूचना वस्तु अद्यतन किया जाता है, मैं प्रत्येक ग्राहक है कि सूचना से जुड़ा है करने के लिए ईमेल भेजना चाहते हैं।

हालांकि, जब मैं sold_to फ़ील्ड को लॉग करता हूं कि सिग्नल प्राप्त होता है तो मैं हमेशा सहेजने से पहले डेटा को पसंद करता हूं।

मुझे लगता है कि इसका कारण यह है क्योंकि इसकी कई टोमनीफिल्ड और डेटा एक अलग तालिका में संग्रहीत है, लेकिन सभी संबंधों को अद्यतन करने के बाद post_save सिग्नल को कॉल नहीं किया जाना चाहिए?

किसी को भी समाधान के लिए कोई सुझाव मिला है?

class Customer 
    name = models.CharField(max_length=200) 
    category = models.ManyToManyField('Category',symmetrical=False) 
    contact = models.EmailField() 

class Information 
    name = models.CharField(max_length=200) 
    email = models.EmailField(max_length=200) 
    mod_date = models.DateTimeField(auto_now=True) 
    sold_to = models.ManyToManyField(Customer, null=True, blank=True) 


def send_admin_email(sender, instance, signal, *args, **kwargs): 
    from myapp import settings 
    for cust in instance.sold_to.all(): 
     settings.debug(cust.name) 

post_save.connect(send_admin_email, sender=Information) 

संपादित करें: #django में apollo13 मुझे इस के लिए सतर्क कर दिया: "संबंधित आइटम (बातें कई-से-अनेक संबंध में सहेजा जा रहा है) आप के रूप में, एक मॉडल की विधि को बचाने के हिस्से के रूप में सहेजा नहीं कर रहे हैं खोजा गया।" - http://groups.google.com/group/django-users/msg/2b734c153537f970

लेकिन 9 जुलाई 2006 से ही मुझे वास्तव में उम्मीद है कि इसके लिए एक समाधान है।

उत्तर

5

here का सामना करने वाले मुद्दे के लिए एक खुली टिकट है। जब आप इसे रिलीज में लाते हैं, तो आप उस पर नजर रख सकते हैं, या आप उस पैच को लागू करने का प्रयास कर सकते हैं जो यह प्रदान करता है और देखता है कि इससे मदद मिलती है या नहीं।

+0

त्वरित उत्तर के लिए धन्यवाद। मैंने पैच की कोशिश की, और थोड़ा हैकिंग के बाद मुझे यह काम करने के लिए मिला। नीचे समाधान पोस्ट करेंगे। – schmilblick

1

ऊपर उल्लिखित code.djangoproject.com से पैच लगाने के बाद यह मेरा समाधान है।

जोड़ा इस models.py में:

from django.db.models.signals import m2m_changed 
m2m_changed.connect(send_admin_email, sender=Information) 

और send_admin_email समारोह:

def send_customer_email(sender, instance, action, model, field_name, reverse, objects, **kwargs): 
    if ("add" == action): 
     # do stuff 
1

मैं एक ही मुद्दे के पार चला के बाद से मैं M2M क्षेत्रों अपने मॉडल में मैं भी तरह pre_save मिला डेटा।

स्थिति में, समस्या यह है कि एम 2 एम फ़ील्ड में ऑटो से उत्पन्न आईडी प्राप्त करने के लिए दोनों संबंधित मॉडल सहेजे जाने चाहिए।

मेरे समाधान में, न तो मैंने पोस्ट_सेव सिग्नल और न ही m2m_changed सिग्नल का उपयोग किया, सिग्नल के बजाय मैंने modelAdmin क्लास परिभाषा में log_addition और log_change विधियों का उपयोग किया।

अपने कस्टम ModelAdmin वर्ग में:

class CustomModelAdmin(admin.ModelAdmin): 
     def log_addition(self, request, object): 
     """ 
     Log that an object has been successfully added. 
     """ 
      super(CustomModelAdmin, self).log_addition(request, object) 
      #call post_save callback here object created 

     def log_change(self, request, object): 
     """ 
     Log that an object has been successfully changed. 
     """ 
      super(CustomModelAdmin, self).log_change(request, object) 
      #call post_save callback here object changed 

अगर आप चाहते हैं, आप भी log_deletion() विधि को भी पार कर।

हैप्पी ओवरराइडिंग ...

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