2012-06-08 25 views
5

Aşağıdaki kodla Django'da soyut kalıtım uygulamaya çalışıyorum ancak bir MAX yineleme derinliği hatası üretiyor. Bir modelin save yöntemini geçersiz kılmaya çalışıyorum.Django Modelinde Soyut Kalıtım Model, MAX yineleme derinliği hatasına neden oluyor

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) 

bu hatayı üretir (iz sonunu, bu uzun olduğunu):

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

'BaseModel' tarafından' self .__ class__' değiştirmeyi denediniz mi? Bu arada, "geri dönüş" e ihtiyacınız yok çünkü "kaydet" hiçbir şey döndürmez. – Maccesch

+0

oh evet, teşekkürler. :) – ultrajohn

cevap

12

değil çağrı self.__class__ üzerinde super yap! Gerçek sınıfına deyin:

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

self.__class__ hep örneğinin gerçek beton sınıfı ifade eder olmasıdır. Yani BaseModelMyModel, BaseModelBaseModelself.__class__ yöntemine aldığınızda, MyModel hala MyModel olduğunu. Yani BaseModel olan MyModel'in süper yerini bulur, bu yüzden BaseModel'de bir kez daha MyModel'in süper yerini bulduğu bir çağrıyı çağırır ...

+0

Oh, gerçekten yararlı. Teşekkür ederim! – ultrajohn

İlgili konular