Django - 有没有办法在循环中优化 ORM ManyToOne 调用?

我在 Django 视图中看到自己有这种模式:


<ol>

{% for a in ModelA %}

    <li>{{ a.title }}</li>

    <ol>

    {% for b in a.modelb_set.all %}

        <li>{{ b.title }}</li>

        <ul>

            {% for c in b.modelc_set.all %}

                <li>{{ c.text }}</li>

                <ul>

                {% for d in c.modeld_set.all %}

                    <li>{{ d.text }}</li>

                {% endfor %}

                </ul>

            {% endfor %}

        {% endif %}

        </ul>

    {% endfor %}

    </ol>

{% endfor %}

</ol>

当然,这里的问题是,这是进行 n^4 次数据库调用,这是非常不可扩展的。对于单个ModelA对象,我进行了大约 23 个 SQL 查询,并且我假设这个数字只会随着ModelA查询数量的增加而增加。


是否有一种通用方法可以减少此处需要进行的查询数量?任何想法,将不胜感激 :)


(如果您很好奇,实际代码在这里- ModelA 是 Poll,ModelB 是 TextChoiceQuestion,ModelC 是 TextChoice,ModelD 是 TextChoiceNuance。


aluckdog
浏览 133回答 1
1回答

繁星coding

你有模型吗?如果是这样,我建议上传模型代码。我通常这样编码。首先,如果我使用 ManyToManyField,请使用 prefetch_related('fields', 'field__subfield', )。Model.objects.prefetch_related('afield', 'afield__bmodel_field', 'afield__bmodel_field__cmodel_field')其次,你必须使用related_name。不管ManyToManyField,ForeignKey,都可以获得更好的相关名称。class CheckList(models.Model):&nbsp; &nbsp; """docstring for CheckList"""&nbsp; &nbsp; """ 설명 """&nbsp; &nbsp; name = models.CharField(max_length=30)&nbsp; &nbsp;def __str__(self):&nbsp; &nbsp; &nbsp; &nbsp;return self.nameclass Question(models.Model):&nbsp; &nbsp; checklist = models.ForeignKey(CheckList,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; on_delete=models.CASCADE, related_name='questions')# examplecheck_list = CheckList.objects.prefetch_related('questions').all()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python