在模板中,我显示了项目(i)的前5个翻译。在模板中处理以下逻辑:
more...。下面是我提出的(功能)模板代码:
{% if i.translation_set.all %}
<ul>
{% for t in i.translation_set.all|slice:"6" %}
{% if forloop.counter < 6 %}
<li>
<a href="#">
<i class="fa fa-play mr-2"></i>
{{ t.language }}
<i class="fa fa-commenting-o ml-1"></i>
</a>
</li>
{% else %}
<li>more...</li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<a href="{% url 'view-item' i_id=i.id slug=i.slug %}">Add translation</a>
{% endif %}下面是我对此代码的关注:
if i.translation_set.all执行什么样的查询?它是查询所有的翻译,还是停止在1?slice查询可能更好,因为这会在以后使用,并且可能是(自动)?缓存?发布于 2017-03-08 14:21:49
{% if i.translation_set.all %}如果以后没有遍历查询集,那么应该避免执行{% if i.translation_set.all %},因为它将从数据库中获取所有的翻译。一个改进是使用exists代替。
{% if i.translation_set.exists %}更好的是,您可以使用{% with tag %}来获取切片的查询集。然后,可以在if语句中使用切片的查询集,并对其进行循环。
{% with translations=i.translation_set.all|slice:"6" %}
{% if translations %}
<ul>
{% for t in translations %}
...
{% endfor %}
</ul>
...
{% endif %}
{% endwith %}在切片中获取6个对象的另一个替代方法是将计数作为一个单独的查询来获取。然后,可以将切片限制为5个对象。
{% with translation_count=i.translation_set.count %}
{% if translations_count %}
<ul>
{% for t in translations|slice:"5" %}
...
{% endfor %}
{% if t.count > 5 %}
<li>more...</li>
{% endif %}
</ul>
...
{% endif %}
{% endwith %}这使用两个查询而不是一个查询,但是如果您发现它更清楚,您可能会更喜欢它。实际上,额外的查询可能对性能没有任何影响。
https://stackoverflow.com/questions/42673716
复制相似问题