kis*_*rgy 10 django recursion model django-orm
我有一个我的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()])
Run Code Online (Sandbox Code Playgroud)
每当我制作一个新的(空的)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()])
...
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我能够通过检查来修复它,pk然后只生成名称,但我认为它应该工作的方式只返回名称,因为", ".join...它将是一个空列表.相反,发生了一些我不理解的递归.
knb*_*nbk 19
问题是,team.players当Team实例尚未保存到数据库时,您无法访问该字段.试图做到这一点将提出一个ValueError.
但是,在尝试提高时ValueError,代码将尝试获取team将间接调用的对象的表示unicode(team).这将尝试访问self.players,这将尝试ValueError在第一个引发之前引发另一个.这一直持续到达到最大递归深度,但仍然没有ValueError抛出.因此,你只会看到RuntimeError.
如果您执行以下任一操作,则会发生相同的情况(应该?):
>>> team
>>> repr(team)
>>> unicode(team)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2595 次 |
| 最近记录: |