9

我正在尝试使用以下代码在 Django 中实现抽象继承,但它会产生 MAX 递归深度错误。我正在尝试覆盖模型的save方法。

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
4

1 回答 1

17

不要打电话!_super _ self.__class__在实际课程中调用它:

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

这是因为self.__class__总是指实例的实际具体类。所以如果你继承MyModelBaseModel,当你得到save方法时BaseModel self.__class__仍然是MyModel。于是找到了MyModel的super,也就是BaseModel,于是在BaseModel中调用save,又找到了MyModel的super……

于 2012-06-08T11:47:14.533 回答