Django 在模板中迭代RelatedManager对象时是否可以减少查询?

Django 在模板中迭代RelatedManager对象时是否可以减少查询?,django,Django,这是一个简单的假设。在我的Django应用程序中,我有Kit、KitSku和Sku的模型。KitSku模型将Sku与套件相关联,并提供该套件中该Sku的数量。在模板中,我有如下内容: <!-- SELECT * FROM kitsku_table WHERE kit_id = <Kit.id> --> {% for kitsku in kit.kitsku_set.all %} <!-- SELECT * FROM sku_table WHERE sku = &

这是一个简单的假设。在我的Django应用程序中,我有Kit、KitSku和Sku的模型。KitSku模型将Sku与套件相关联,并提供该套件中该Sku的数量。在模板中,我有如下内容:

<!-- SELECT * FROM kitsku_table WHERE kit_id = <Kit.id> -->
{% for kitsku in kit.kitsku_set.all %}
  <!-- SELECT * FROM sku_table WHERE sku = <KitSku.sku> -->
  <div>{{ kitsku.sku.name }}</div>
{% endfor %}

{kit.kitsku_set.all%}
{{kitsku.sku.name}
{%endfor%}
现在,这里的问题是Django正在查询所有KitSku行,然后它在每个迭代的单独SQL查询中查询for循环中的每个sku

我可以让kitsku_set.all()调用生成的SQL查询与Sku模型执行联接吗

第一个查询需要更像:

SELECT * FROM kitsku_table k LEFT JOIN sku_table s ON (k.sku = s.sku) 
WHERE k.kit_id = <Kit.id>
选择*从kitsku_表k左连接sku_表s ON(k.sku=s.sku)
其中k.kit_id=

在视图中执行此类逻辑,并使用直接查询外键

kitskus = Kit.objects.get(id=3).kitsku_set.select_related('sku')
return direct_to_template(request, "mytemplate.html", {'kitskus': kitskus})

我只是复制了一个类似问题的答案,但我认为这是一个更好的方法

看法

模板

{% block content %}
  {% for newsletter in newsletter_list %}
    <h2>{{ newsletter.label }}</h2>
    <p>Volume {{ newsletter.volume }}, Number {{ newsletter.number }}</p>
    <p>{{ newsletter.article }}</p>
    <ul>
    {% for a in newsletter.article_set.all %}
      <li>{{ a.title }}</li>
    {% endfor %}
    </ul>
  {% endfor %}
{% endblock %}
{%block content%}
{时事通讯中的时事通讯%u列表%}
{{newsletter.label}
卷{{newsletter.Volume},编号{{newsletter.Number}

{{newsletter.article}

    {newsletter.article_set.all%}
  • {{a.title}}
  • {%endfor%}
{%endfor%} {%endblock%}
以下是完整的解释: 希望有帮助


很公平。在我的视图中使用select_related()就是一个好方法。我只是想也许那里有一些Django魔法。
{% block content %}
  {% for newsletter in newsletter_list %}
    <h2>{{ newsletter.label }}</h2>
    <p>Volume {{ newsletter.volume }}, Number {{ newsletter.number }}</p>
    <p>{{ newsletter.article }}</p>
    <ul>
    {% for a in newsletter.article_set.all %}
      <li>{{ a.title }}</li>
    {% endfor %}
    </ul>
  {% endfor %}
{% endblock %}