2012-06-08 12 views
5

Estoy tratando de implementar la herencia abstracta en Django con el siguiente código, pero produce un error de profundidad de recursión MAX. Estoy intentando anular el método save de un modelo.Herencia abstracta en el modelo de Django, que causa el error de profundidad de recursión 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) 

produce este error (al final de la traza, que es muy largo):

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

¿Has intentado reemplazar 'self .__ class__' por' BaseModel'? Por cierto, no necesitas el 'return' porque' save' no devuelve nada. – Maccesch

+0

oh sí, gracias. :) – ultrajohn

Respuesta

12

hacer no llamada super en self.__class__! Llamarlo en la clase real:

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

Esto se debe a self.__class__ siempre se refiere a la clase concreta real de la instancia. Por lo tanto, si hereda MyModel de BaseModel, cuando llegue al método save en BaseModelself.__class__ sigue siendo MyModel. Así que encuentra el super de MyModel, que es BaseModel, así que llama a guardar en BaseModel, que una vez más encuentra el super de MyModel ...

+0

Oh, realmente útil. ¡Gracias! – ultrajohn

Cuestiones relacionadas