2017-03-08 65 views
1

雖然我知道如何製作它,並且搜索了用於比較我的代碼的示例,但我無法得到爲什麼我無法調用其父母的__str__內部調用__str__的模型。我得到一個RuntimeError: maximum recursion depth exceeded in __subclasscheck__ ,這不應該發生。無法在Django中自定義__str__調用父級的__str__

這是我的代碼如下。不,這可能會影響它的抵押品工作:

@python_2_unicode_compatible 
class A(models.Model): 
    def __str__(self): 
     return self.attr 

@python_2_unicode_compatible 
class B(A): 
    def __str__(self): 
     return "%s - %s" % (super(B, self).__str__(), self.attr_two) 
+0

此代碼將工作。您需要顯示真實的代碼和回溯(或直到它開始重複)。 –

回答

2

好吧,我設法知道發生了什麼。這是因爲裝飾者python_2_unicode_compatiblefrom django.utils.encoding import python_2_unicode_compatible)。這裏就是問題開始回溯:

/my/path/to/django/utils/six in <lambda>(self) 
    840        klass.__name__) 
    841   klass.__unicode__ = klass.__str__ 
--> 842   klass.__str__ = lambda self: self.__unicode__().encode('utf-8') 
    843  return klass 
    844 

因此,裝飾分配__str____unicode__,然後分配到__str__這就要求__unicode__(循環依賴)一拉姆達。這就是你如何去「無限!超越!」遞歸條款。刪除修飾器並將類方法更改爲__unicode__可解決該問題。

編輯

的替代,以保持裝飾將在父類中添加自定義方法:

def str(self): 
    return "foo" 

def __str__(self): 
    return self.str() 

然後在孩子你只是做self.str()也。

0

__str__是每個對象,而不是每個類。所以,你會這樣做:

class B(A): 

    def __str__(self): 
     return "%s - %s" % (self.attr, self.attr_two)