2012-06-08 7 views
5

मैं निम्नलिखित कोड के साथ Django में अमूर्त विरासत को लागू करने की कोशिश कर रहा हूं, लेकिन यह MAX रिकर्सन गहराई त्रुटि उत्पन्न करता है। मैं एक मॉडल की save विधि को ओवरराइड करने का प्रयास कर रहा हूं।Django मॉडल में सार विरासत, जिसके कारण MAX रिकर्सन गहराई त्रुटि

class BaseModel(models.Model): 
    class Meta: 
     abstract = True 

    def save(self, *args, **kwargs): 
     #i'm doing something here 

     #i think the problem is in the return statement specifically because of the 
     #self.__class__ expression. 
     return super(self.__class__, self).save(*args, **kwargs) 

class MyModel(BaseModel): 
    p = models.CharField(max_length=30) 

इस त्रुटि पैदा करता है (ट्रेस के अंत में, यह लंबा है):

File "/home/jultra/ap3w/jultra_01/mysite/testsite/models.py", line 10, in save 
    return super(self.__class__, self).save(*args, **kwargs) 
    File "/home/jultra/ap3w/jultra_01/mysite/testsite/models.py", line 10, in save 
    return super(self.__class__, self).save(*args, **kwargs) 
    File "/home/jultra/ap3w/jultra_01/mysite/testsite/models.py", line 10, in save 
    return super(self.__class__, self).save(*args, **kwargs) 
    File "/home/jultra/ap3w/jultra_01/mysite/testsite/models.py", line 10, in save 
    return super(self.__class__, self).save(*args, **kwargs) 
RuntimeError: maximum recursion depth exceeded 
+2

क्या आपने 'बेसमोडेल' द्वारा 'self .__ class__' को बदलने की कोशिश की है? वैसे, आपको 'वापसी' की आवश्यकता नहीं है क्योंकि 'save' कुछ भी वापस नहीं करता है। – Maccesch

+0

ओह हाँ, धन्यवाद। :) – ultrajohn

उत्तर

12

करो नहीं कॉल superself.__class__ पर! वास्तविक वर्ग पर कॉल करें:

return super(BaseModel, self).save(*args, **kwargs) 

इसका कारण यह है self.__class__ हमेशा उदाहरण के वास्तविक ठोस श्रेणी को संदर्भित करता है। इसलिए यदि आप से MyModel प्राप्त करते हैं, तो विधि BaseModelself.__class__ में MyModel है। तो यह माईमोडेल का सुपर पाता है, जो बेसमोडेल है, इसलिए बेसमोडेल में सेव को कॉल करता है, जो एक बार फिर माईमोडेल के सुपर को पाता है ...

+0

ओह, वास्तव में सहायक। धन्यवाद! – ultrajohn

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