2012-08-05 17 views
8

मान लें कि मेरे पास हीरो नामक एक वर्ग है जिसका नाम "नाम" है। हर बार एक नया हीरो ऑब्जेक्ट बनाया जाता है, मैं " is a hero" जोड़ना चाहता हूं। क्या मैं इसके लिए __init__ का उपयोग कर सकता हूं? या क्या एक डीजेंगो-विशिष्ट विधि है जिसके लिए मैं ओवरराइड कर सकता हूं?django मॉडल बनाने के उपयोग पर __init__?

class Hero(modes.Model) 
    name = models.CharField(max_length=100) 
    def __init__(self, *args, **kwargs): 
     name += " is a hero" 
     super(Hero, self).__init__(*args, **kwargs) 
+1

यह लगभग कभी भी आप जो चाहते हैं वह नहीं है। अपनी असली समस्या का वर्णन करें। –

+0

@ IgnacioVazquez-Abrams मुझे एक और मॉडल अपडेट करना है जो मेरे 'हीरो' वर्ग के समेकित इनपुट पर आधारित है। – Joey

+1

@ जॉय इसके बजाय [सिग्नल] (https://docs.djangoproject.com/en/1.4/topics/signals/) का उपयोग करें। – Dougal

उत्तर

15

"हर बार एक नए हीरो वस्तु बनाई गई है" से तुम्हारा मतलब हैं "हर बार एक हीरो रिकॉर्ड डेटाबेस में बनाई गई है," तो नहीं, तुम नहीं __init__ विधि में ऐसा करना चाहते हैं, चूंकि इसे किसी भी समय पाइथन में हीरो ऑब्जेक्ट बनाया जाता है, जिसमें आप डेटाबेस से मौजूदा रिकॉर्ड प्राप्त कर रहे हैं।

जो भी आप चाहते हैं, करने के लिए, आप Django के post_save signal का उपयोग कर सकते हैं, सिग्नल कॉलबैक में जांच कर रहे हैं कि created कीवर्ड पैरामीटर सही है और यदि आपका "सृजन पर" तर्क है तो ऐसा करें।

वैकल्पिक रूप से, और कुछ मामलों में और अधिक सरल और प्राकृतिक, आप हीरो save() विधि इस प्रकार है ओवरराइड कर सकते हैं:

def save(self, *args, **kwargs): 
    if not self.pk: # object is being created, thus no primary key field yet 
     self.name += " is a hero" 
    super(Hero, self).save(*args, **kwargs) 

ध्यान दें कि Djagno के bulk_create विधि या तो बाद बचाने के संकेत या save बुला ट्रिगर को छोड़ देगा।

+4

जैसा कि [दस्तावेज़ों की व्याख्या] [https://docs.djangoproject.com/en/1.4/topics/db/models/#overriding-model-methods), आपको हमेशा '* args' और' ** kwargs 'शामिल करना चाहिए अभिभावक वर्ग की 'सेव' विधि, * यानी * सुपर (हीरो, स्वयं)। सेव (* args, ** kwargs) पर कॉल में। इसका कारण 'सेव()' विधि के हस्ताक्षर में परिवर्तनों (Django, या आपके कोड में) के खिलाफ भावी सबूत है। – supervacuo

+1

@supervacuo - अच्छी पकड़, मैंने इसे संपादित किया है, धन्यवाद। – Ghopper21

+1

भावी पाठकों के लिए चेतावनी के रूप में, 'सेव' ओवरराइड करना सार्वभौमिक रूप से सुरक्षित नहीं है। [बैच सेव ओवरलोडेड सेव विधियों का आह्वान नहीं करेगा या 'post_save' और' pre_save' सिग्नल 'को कॉल नहीं करेगा] (https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods)। मुझे यकीन नहीं है कि क्या Django थोक अद्यतन या सृजन पर अनुकूलित करने का कोई तरीका प्रदान करता है, हालांकि यह ऐसा नहीं दिखता है, इसलिए आपको सावधान रहना चाहिए कि आप यह कैसे करते हैं और यह सुनिश्चित करते हैं कि यदि आप रक्षा करते हैं तो थोक बचत नहीं होती है कस्टम अद्यतन व्यवहार पर। – Taywee