Django .only() 导致最大递归深度超出错误?
Django .only() causing maximum recursion depth exceeded error?
我使用 Django 的 .only()
构造来仅查询我需要的列。
例如
Trainer.objects.filter(id__in=ids).only('id', 'lives')
这是我为重现此内容而编写的一个简单示例:
class BaseTrainer(models.Model):
mode = models.IntegerField(help_text="An integer")
def __init__(self, *args, **kwargs):
super(BaseTrainer, self).__init__(*args, **kwargs)
self._prev_mode = self.mode
class Trainer(BaseTrainer):
name = models.CharField(max_length=100, help_text="Name of the pokemon")
trainer_id = models.CharField(max_length=10, help_text="trainer id")
badges = models.IntegerField(help_text="Power of the pokemon (HP)")
lives = models.PositiveIntegerField(default=sys.maxsize)
unique_together = ("name", "trainer_id")
def __init__(self, *args, **kwargs):
super(Trainer, self).__init__(*args, **kwargs)
self._temp = self.lives
@classmethod
def test(cls):
t = Trainer.objects.only('trainer_id').all()
print(t)
我只需要 id 和 name 字段,这是肯定的。
maximum recursion depth exceeded
的原因是什么?
原来 maximum recursion depth exceeded
的原因是因为从模型继承和构造函数覆盖。
如您在代码中所见,
self._prev_mode = self.mode
我们尝试在超模型class的构造函数中访问mode
。
所以,即使我们不需要这个字段供我们使用,我们仍然必须在每个这样的模型调用中将其包含在 .only()
中。
但是,根据文档,.only()
应该在最坏的情况下进行另一个数据库查询以获取字段值,为什么要递归?
嗯,请注意,这个字段是在父模型的构造函数中访问的。这就是问题所在。每次都无法在构造函数中读取该值,因此尝试从数据库中获取。
再次调用构造函数并继续递归循环,直到 python 停止它。
无论如何,通过在 .only()
调用中添加 mode
来解决这个问题。
Trainer.objects.filter(id__in=ids).only('id', 'name', 'mode')
我使用 Django 的 .only()
构造来仅查询我需要的列。
例如
Trainer.objects.filter(id__in=ids).only('id', 'lives')
这是我为重现此内容而编写的一个简单示例:
class BaseTrainer(models.Model):
mode = models.IntegerField(help_text="An integer")
def __init__(self, *args, **kwargs):
super(BaseTrainer, self).__init__(*args, **kwargs)
self._prev_mode = self.mode
class Trainer(BaseTrainer):
name = models.CharField(max_length=100, help_text="Name of the pokemon")
trainer_id = models.CharField(max_length=10, help_text="trainer id")
badges = models.IntegerField(help_text="Power of the pokemon (HP)")
lives = models.PositiveIntegerField(default=sys.maxsize)
unique_together = ("name", "trainer_id")
def __init__(self, *args, **kwargs):
super(Trainer, self).__init__(*args, **kwargs)
self._temp = self.lives
@classmethod
def test(cls):
t = Trainer.objects.only('trainer_id').all()
print(t)
我只需要 id 和 name 字段,这是肯定的。
maximum recursion depth exceeded
的原因是什么?
原来 maximum recursion depth exceeded
的原因是因为从模型继承和构造函数覆盖。
如您在代码中所见,
self._prev_mode = self.mode
我们尝试在超模型class的构造函数中访问mode
。
所以,即使我们不需要这个字段供我们使用,我们仍然必须在每个这样的模型调用中将其包含在 .only()
中。
但是,根据文档,.only()
应该在最坏的情况下进行另一个数据库查询以获取字段值,为什么要递归?
嗯,请注意,这个字段是在父模型的构造函数中访问的。这就是问题所在。每次都无法在构造函数中读取该值,因此尝试从数据库中获取。 再次调用构造函数并继续递归循环,直到 python 停止它。
无论如何,通过在 .only()
调用中添加 mode
来解决这个问题。
Trainer.objects.filter(id__in=ids).only('id', 'name', 'mode')