为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

aluckdog 2021-11-02 14:56:19
我在 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。
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

你有模型吗?如果是这样,我建议上传模型代码。


我通常这样编码。首先,如果我使用 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):

    """docstring for CheckList"""

    """ 설명 """

    name = models.CharField(max_length=30)


   def __str__(self):

       return self.name


class Question(models.Model):

    checklist = models.ForeignKey(CheckList, 

            on_delete=models.CASCADE, related_name='questions')


# example

check_list = CheckList.objects.prefetch_related('questions').all()


查看完整回答
反对 回复 2021-11-02
  • 1 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信