2010-10-13 12 views
11

उदाहरणपायथन/Django: कस्टम मॉडल तरीकों को जोड़ना?

class model(models.Model) 
    .... 
    def my_custom_method(self, *args, **kwargs): 
     #do something 

के लिए उपयोग करना जब मैं pre_save के दौरान इस विधि कॉल, बचाने के लिए, post_save आदि करने की कोशिश, अजगर एक लेखन त्रुटि को जन्म देती है; अनबाउंड विधि।

कोई कस्टम मॉडल विधियों को कैसे जोड़ सकता है जिसे मॉडल.objects.get(), आदि जैसे निष्पादित किया जा सकता है?

संपादित करें: super(model, self).my_custom_method(*args, **kwargs) लेकिन इस मामले में अजगर का कहना है कि मॉडल विशेषता my_custom_method

उत्तर

25

नहीं है आप इस विधि कैसे बुला रहे हैं उपयोग करने की कोशिश? आपने इंस्टेंस विधि परिभाषित की है, जिसे क्लास के उदाहरण पर ही कक्षा के उदाहरण पर ही बुलाया जा सकता है। दूसरे शब्दों में, एक बार आपके पास model का उदाहरण है जिसे mymodelinstance कहा जाता है, तो आप mymodelinstance.my_custom_method() कर सकते हैं।

यदि आप इसे कक्षा पर कॉल करना चाहते हैं, तो आपको कक्षा के तरीके को परिभाषित करने की आवश्यकता है। आप इसे अपनी विधि पर @classmethod सजावटी के साथ कर सकते हैं। ध्यान दें कि सम्मेलन द्वारा क्लासमेड के लिए पहला पैरामीटर cls है, self नहीं। Classmethod पर विवरण के लिए the Python documentation देखें।

हालांकि, यदि आप वास्तव में ऐसा करना चाहते हैं तो एक क्वेरीसेट-स्तरीय ऑपरेशन करता है, जैसे objects.filter() या objects.get(), तो आपकी सबसे अच्छी शर्त कस्टम प्रबंधक को परिभाषित करना और अपनी विधि को वहां जोड़ना है। फिर आप model.objects.my_custom_method() कर पाएंगे। फिर, प्रबंधकों पर Django documentation देखें।

0

यदि आप अपने मॉडल के लिए सिग्नल लागू कर रहे हैं तो इसे केवल मॉडल वर्ग में परिभाषित करने की आवश्यकता नहीं है। आप कक्षा के बाहर इसे परिभाषित कर सकते हैं और कक्षा के नाम को कनेक्ट फ़ंक्शन के पैरामीटर के रूप में पास कर सकते हैं।

हालांकि, आपके मामले में आपको विधि तक पहुंचने के लिए मॉडल ऑब्जेक्ट की आवश्यकता है।

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