2012-06-08 9 views
5

Próbuję zaimplementować dziedziczenie abstrakcyjne w Django za pomocą następującego kodu, ale generuje on błąd maksymalnej głębokości rekursji. Próbuję zastąpić metodę modelu save modelu.Streszczenie Dziedziczenie w Django Model, powodując błąd głębokości rekurencji 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) 

produkuje ten błąd (koniec śladu, to długa):

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

Czy próbowałeś zastąpić 'self .__ class__' przez' BaseModel'? Nawiasem mówiąc, nie potrzebujesz 'return', ponieważ' save' nie zwraca niczego. – Maccesch

+0

o tak, dziękuję. :) – ultrajohn

Odpowiedz

12

Czy nie połączenia super na self.__class__! Nazywają to na rzeczywistej klasy:

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

To dlatego self.__class__ zawsze odnosi się do rzeczywistej klasy betonu instancji. Jeśli więc odziedziczysz MyModel z BaseModel, po przejściu do metody self.__class__ nadal będzie to MyModel. Więc znajduje superModel, który jest BaseModel, więc wywołuje save w BaseModelu, który po raz kolejny znajduje super MyModel ...

+0

Och, naprawdę pomocne. Dziękuję Ci! – ultrajohn