2009-11-07 17 views
7

यदि आप queryset.delete() विधि का उपयोग कर रहे हैं, तो Django पूर्व/post_delete सिग्नल भेज रहा है, लेकिन क्या इसे queryset.update() पर पूर्व/post_save भी नहीं भेजना चाहिए?Django: queryset.update पर सिग्नल

उत्तर

6

शायद यह होना चाहिए, लेकिन ऐसा नहीं है। .update() QuerySet में अलग-अलग ऑब्जेक्ट्स पर .save() विधि को कॉल नहीं करता है, और इसके बजाय सभी को एकल SQL कॉल (अद्यतन, जैसा होता है) में अपडेट करता है। चूंकि यह .save() का उपयोग नहीं करता है, इसलिए यह पूर्व-और पोस्ट-सेव सिग्नल को कॉल करने के लिए असंगत होगा। मैं निश्चित रूप से उपयोग-मामलों की कल्पना कर सकता हूं जिसमें कोई ऐसा कर सकता है, लेकिन मैं उन मामलों की कल्पना भी कर सकता हूं जिनमें कोई नहीं होगा। ऐसा लगता है कि प्री-एंड-सेव सिग्नल को कॉल नहीं करना यहां सही व्यवहार है क्योंकि यह प्रोग्रामर के लिए अधिक लचीलापन छोड़ देता है। उन संकेतों को मैन्युअल रूप से ट्रिगर करना मुश्किल नहीं है, और मुझे लगता है कि यह निश्चित रूप से एक बेहतर डिजाइन निर्णय है कि प्रोग्रामर को वांछित व्यवहार प्राप्त करने के लिए सिग्नल ट्रिगर करना याद रखें, ताकि वे अवांछित व्यवहार से बचने के लिए संकेतों को डिस्कनेक्ट करना याद रखें।

+1

वैसे भी कारण बताए गए कारणों में मुझे लगता है कि यह किसी भी तरह का असंगत व्यवहार है, क्योंकि queryset.delete() विधि भी एक उदाहरण पर डिलीट() को कॉल नहीं करती है, लेकिन यह model.delete() के समान सिग्नल भेजती है! –

+1

इसके अलावा, एक क्वेरीसेट पर एक सेव-संबंधित सिग्नल भेजने में सक्षम होने के लिए, उन्हें अनिवार्य रूप से अपडेट के अलावा तत्वों के लिए चयन करना होगा, थोक अद्यतन विधि होने के लाभों को समाप्त करना होगा। –

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