2017-03-08 5 views
1

Obwohl ich weiß, wie man es macht, und haben Beispiele gesucht für den Vergleich meines Codes, kann ich nicht bekommen, warum ich ein Modell anrufen kann, hat seine __str__ Aufruf innerhalb seiner Eltern __str__. Ich bekomme eine RuntimeError: maximum recursion depth exceeded in __subclasscheck__ , die nicht passieren sollte.Kann nicht machen __str__ Aufruf Eltern __str__ in Django

Hier ist mein Code unten. Keine Sicherheiten Arbeit, die es noch beeinflussen könnte:

@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

Dieser Code würde funktionieren. Sie müssen den echten Code und das Traceback (oder so viel davon, bis es sich zu wiederholen beginnt) zeigen. –

Antwort

2

Ok, ich wusste, was los war. Es war wegen des Dekorators python_2_unicode_compatible (from django.utils.encoding import python_2_unicode_compatible). Hier ist die Rückverfolgung, wo Problem beginnt:

/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 

Also, der Dekorateur __str__ zu __unicode__ zuweist, dann __str__ weist eine Lambda die __unicode__ (zirkuläre Abhängigkeit) nennt. Und so gehst du zu "Infinity! Und darüber hinaus!" in Rekursionsbegriffen. Löschen des Dekorators und Ändern der Klassenmethoden zu __unicode__ löst das Problem.

EDIT

Eine Alternative der Dekorateur zu halten würde eine benutzerdefinierte Methode in der übergeordneten werden hinzufügen:

def str(self): 
    return "foo" 

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

Dann in dem Kind, das Sie tun self.str() gerade auch.

0

__str__ ist auf pro Objekt, nicht pro Klasse. Also, würden Sie tun:

class B(A): 

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