2017-03-08 4 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__に変更すると、この問題は解決されます。デコレータを保つために

EDIT

代替は親にカスタムメソッドを追加することになります。

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) 
関連する問題