Python Django-有没有一种方法可以优化循环中的ORM多通调用?
我在Django的观点中看到了这种模式:Python Django-有没有一种方法可以优化循环中的ORM多通调用?,python,django,django-models,django-views,django-orm,Python,Django,Django Models,Django Views,Django Orm,我在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 %}
<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>
{ModelA%%中的a的百分比}
{{a.title}}
{a.modelbu set.all%}
{{b.title}}
{b.modelc_set.all%}
- {{c.text}}
{c.modeld_set.all%}
- {{d.text}}
{%endfor%}
{%endfor%}
{%endif%}
{%endfor%}
{%endfor%}
当然,这里的问题是,这是在进行n^4个数据库调用,这是非常不可伸缩的。对于单个ModelA
对象,我进行了大约23次SQL查询,我假设这个数字只会随着ModelA
查询数量的增加而增加
有没有一个通用的方法来减少需要在这里进行的查询的数量?如有任何想法,将不胜感激:)
(如果你好奇的话,实际的代码是-ModelA是Poll,ModelB是textcoocequestion,ModelC是textcooce,ModelD是textcoocenuance。你有模型吗?
如果是这样,我建议上传模型代码
我通常这样编码。
首先,如果我使用ManyToManyField,则使用预取_相关('fields','field_usubfield',)
其次,你必须使用相关的名字。不管有多少字段,外键,你都可以得到一个更好的相关名字
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()
你有模特儿吗?
如果是这样,我建议上传模型代码
我通常这样编码。
首先,如果我使用ManyToManyField,则使用预取_相关('fields','field_usubfield',)
其次,你必须使用相关的名字。不管有多少字段,外键,你都可以得到一个更好的相关名字
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()
模型代码的可能重复项在此处:回答正确,除非您绝对不需要设置相关的\u名称。模型代码在此处:回答正确,除非您绝对不需要设置相关的\u名称。