2012-06-08 8 views
5

Ich versuche abstrakte Vererbung in Django mit dem folgenden Code zu implementieren, aber es erzeugt einen MAX-Rekursionstiefehler. Ich versuche, die save Methode eines Modells zu überschreiben.Abstrakte Vererbung im Django-Modell, verursacht MAX-Rekursionstiefehler

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) 

diesen Fehler erzeugt (Ende der Spur, es ist lange):

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

Haben Sie versucht, "self .__ class__" durch 'BaseModel' zu ersetzen? Übrigens brauchen Sie nicht das 'return', weil' save' nichts zurückgibt. – Maccesch

+0

oh ja, danke. :) – ultrajohn

Antwort

12

Sie nicht Anruf super auf self.__class__! Nennen Sie es auf der tatsächlichen Klasse:

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

Dies liegt daran, self.__class__ immer auf die tatsächliche konkrete Klasse der Instanz bezieht. Also, wenn Sie erben MyModel von BaseModel, wenn Sie an die save Methode in BaseModelself.__class__ erhalten ist immer noch MyModel. So findet es das Super von MyModel, das ist BaseModel, also ruft das Speichern in BaseModel auf, das wieder das Super von MyModel findet ...

+0

Oh, wirklich hilfreich. Vielen Dank! – ultrajohn

Verwandte Themen