2013-07-12 3 views
7

私のDjangoモデルでこの奇妙な問題が発生しましたが、修正できましたが何が起きているのか分かりません。作成時に最大再帰深度がDjangoモデルを超えました

これらはモデルです:

class Player(models.Model): 
    facebook_name = models.CharField(max_length=100) 
    nickname = models.CharField(max_length=40, blank=True) 

    def __unicode__(self): 
     return self.nickname if self.nickname else self.facebook_name 


class Team(models.Model): 
    name = models.CharField(max_length=50, blank=True) 
    players = models.ManyToManyField(Player) 

    def __unicode__(self): 
     name = '(' + self.name + ') ' if self.name else '' 
     return name + ", ".join([unicode(player) for player in self.players.all()]) 

私は新しい(空の)Teamオブジェクトを作成し、それからplayersを取得したいときはいつでも、私はRuntimeError: maximum recursion depth exceededを得ました。 例:

>>> team = Team() 
>>> team.players 
    Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/Users/walkman/Projects/fociadmin/venv/lib/python2.7/site-packages/django/db/models/fields/related.py", line 897, in __get__ 
    through=self.field.rel.through, 
    File "/Users/walkman/Projects/fociadmin/venv/lib/python2.7/site-packages/django/db/models/fields/related.py", line 586, in __init__ 
    (instance, source_field_name)) 
    File "/Users/walkman/Projects/fociadmin/venv/lib/python2.7/site-packages/django/db/models/base.py", line 421, in __repr__ 
    u = six.text_type(self) 
    File "/Users/walkman/Projects/fociadmin/fociadmin/models.py", line 69, in __unicode__ 
    return name + ", ".join([unicode(player) for player in self.players.all()]) 
    File "/Users/walkman/Projects/fociadmin/venv/lib/python2.7/site-packages/django/db/models/fields/related.py", line 897, in __get__ 
    through=self.field.rel.through, 
    File "/Users/walkman/Projects/fociadmin/venv/lib/python2.7/site-packages/django/db/models/fields/related.py", line 586, in __init__ 
    (instance, source_field_name)) 
    File "/Users/walkman/Projects/fociadmin/venv/lib/python2.7/site-packages/django/db/models/base.py", line 421, in __repr__ 
    u = six.text_type(self) 
    File "/Users/walkman/Projects/fociadmin/fociadmin/models.py", line 69, in __unicode__ 
    return name + ", ".join([unicode(player) for player in self.players.all()]) 
... 

なぜこのようなことが起こりますか? pkをチェックして修正して名前を生成することができましたが、", ".join...は空のリストになるため、名前を返すだけで動作するはずです。代わりに、わからない再帰が発生します。

答えて

15

Teamインスタンスがまだデータベースに保存されていない場合、team.playersフィールドにアクセスできないという問題があります。これを行うと、ValueErrorが発生します。

しかし、これを呼び出そうとしている間、コードはteamオブジェクトの表現を取得しようとしますが、これは間接的にunicode(team)を呼び出します。これはself.playersにアクセスしようとします。最初のものが発生する前に別のValueErrorを発生させようとします。これは、最大再帰深度に達するまで続きますが、まだValueErrorがスローされていません。したがって、RuntimeErrorが表示されます。

次のいずれかのやったらどうなる同:エラーの

>>> team 
>>> repr(team) 
>>> unicode(team) 
+0

良い説明を(してください)。 – Brandon

+2

インスタンスが保存される前に多対多の関係にアクセスすると、「ValueError」が発生し、説明されているシナリオにつながります。インスタンスが保存されている場合(プライマリキーがある場合)、関係は空のリストになります。 – AndrewS

+0

@AndrewSあなたは正しいです、私の答えを更新しました。気づいてくれてありがとう! – knbk

関連する問題