私の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...
は空のリストになるため、名前を返すだけで動作するはずです。代わりに、わからない再帰が発生します。
良い説明を(してください)。 – Brandon
インスタンスが保存される前に多対多の関係にアクセスすると、「ValueError」が発生し、説明されているシナリオにつながります。インスタンスが保存されている場合(プライマリキーがある場合)、関係は空のリストになります。 – AndrewS
@AndrewSあなたは正しいです、私の答えを更新しました。気づいてくれてありがとう! – knbk