2012-06-08 17 views
5

Tôi đang cố gắng triển khai kế thừa thừa kế ở Django bằng mã sau đây, nhưng nó tạo ra lỗi sâu đệ quy MAX. Tôi đang cố gắng ghi đè phương thức save của mô hình.Thừa kế trừu tượng trong Mô hình Django, gây ra lỗi sâu đệ quy 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) 

sản xuất lỗi này (kết thúc của các dấu vết, nó dài):

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

Bạn đã thử thay thế 'self .__ class__' bằng' BaseModel'? Bằng cách này, bạn không cần 'return' vì' save' không trả về bất cứ thứ gì. – Maccesch

+0

oh yeah, cảm ơn bạn. :) – ultrajohn

Trả lời

12

Do không gọi super trên self.__class__! Gọi nó trên lớp thực tế:

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

Điều này là do self.__class__ luôn đề cập đến lớp bê tông thực tế của ví dụ. Vì vậy, nếu bạn kế thừa MyModel từ BaseModel, khi bạn truy cập phương thức save trong BaseModelself.__class__ vẫn là MyModel. Vì vậy, nó tìm thấy siêu MyModel, đó là BaseModel, vì vậy gọi các lưu trong BaseModel, mà một lần nữa tìm thấy siêu MyModel ...

+0

Ồ, thực sự hữu ích. Cảm ơn bạn! – ultrajohn