Django.only()导致最大递归深度超出错误?

2024-09-29 23:21:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: textselfidonlyinitmodemodelsdef
1条回答
网友
1楼 · 发布于 2024-09-29 23:21:17

事实证明,maximum recursion depth exceeded的原因是因为继承了一个模型并重写了构造函数。在

正如你在代码中看到的

self._prev_mode = self.mode

我们尝试在超级模型类的构造函数中访问mode。 所以,即使我们不需要这个字段来使用,我们仍然必须在这个模型的每个这样的调用中包含这个字段。在

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

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

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

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

相关问题 更多 >

    热门问题