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

電話をかけないでください!実際のクラスで呼び出します。superself.__class__

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

これは、self.__class__常にインスタンスの実際の具象クラスを参照するためです。したがって、MyModelから継承する場合、のメソッドにBaseModel到達したときはまだです。そのため、BaseModel である MyModel のスーパーが検出され、BaseModel の保存が呼び出され、MyModel のスーパーが再び検出されます...saveBaseModel self.__class__MyModel

于 2012-06-08T11:47:14.533 に答える