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...
应该是一个空列表。相反,发生了一些我不明白的递归。
错误很好的解释。 – Brandon
在实例保存之前访问多对多关系会引发一个ValueError并导致所描述的场景。如果实例被保存(并且具有主键),那么该关系将是空列表。 – AndrewS
@AndrewS你说得对,更新了我的答案。感谢您的注意! – knbk