【问题标题】:Django .only() causing maximum recursion depth exceeded error?Django .only() 导致最大递归深度超出错误?
【发布时间】:2018-01-14 19:29:58
【问题描述】:

我使用 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 的原因是什么?

【问题讨论】:

标签: python django recursion django-models django-orm


【解决方案1】:

原来maximum recursion depth exceeded的原因是因为继承了模型和构造函数覆盖。

正如你在代码中看到的,

self._prev_mode = self.mode

我们尝试在超模型类的构造函数中访问mode。 因此,即使我们不需要此字段供我们使用,我们仍然必须在此模型的每个此类调用中将其包含在 .only() 中。

但是,根据文档,.only() 应该在最坏的情况下进行另一个数据库查询以获取字段值,为什么要递归?

请注意,这个字段是在父模型的构造函数中访问的。这就是问题所在。每次都无法在构造函数中读取该值,因此尝试从数据库中获取该值。 再次调用构造函数,递归循环一直持续到 python 停止它。

无论如何,通过在 .only() 调用中添加 mode 来解决此问题。

Trainer.objects.filter(id__in=ids).only('id', 'name', 'mode')

【讨论】:

    猜你喜欢
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2017-08-09
    • 2011-03-31
    • 2018-12-03
    • 2017-07-18
    相关资源
    最近更新 更多