django - Django Model中的抽象继承,导致MAX递归深度错误

标签 django inheritance recursion depth

我正在尝试使用以下代码在 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

最佳答案

不是 调用 superself.__class__ !在实际类上调用它:

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

这是因为 self.__class__总是指实例的实际具体类。所以如果你继承MyModel来自 BaseModel ,当您到达 saveBaseModel 中的方法self.__class__还在MyModel .于是找到了MyModel的super,也就是BaseModel,于是调用了BaseModel中的save,又一次找到了MyModel的super……

关于django - Django Model中的抽象继承,导致MAX递归深度错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10948132/

相关文章:

Django 为对象定义 get_create_url()、get_update_url() 和 get_delete_url() 是否有意义

python - PyMongo 中使用 server_info() 时出现集合对象不可调用错误

c++ - 避免使用虚方法构造具有空基类的构造函数

c - 使用递归退出条件进行字符串反转

python - 在这个函数中传递 kwargs 的最 Pythonic 方法是什么?

python - 在 django 应用程序中每个用户只允许一个并发登录

javascript - 从 setTimeout() 内部调用 this._super()

c# - 我可以覆盖 C# 中的属性吗?如何?

c++ - 递归打印 n, n-1, n-2,...3,2,1,2,3,...n

java - 这是复制文件的有效方法吗