【问题标题】:Limit django for loop in the template or the view for better performance?在模板或视图中限制 django for 循环以获得更好的性能?
【发布时间】:2017-10-18 22:38:59
【问题描述】:

我的模板上有一个 for 循环。我只想显示博客循环中的前 3 项。

目前只有20个博客条目,但是如果博客条目是500个或更多,从性能角度来看,是在views.py代码中还是在模板代码中限制循环更好?

这里是views.py文件中的循环限制:

blog_latest_entries = BlogDetails.objects.filter(blog_date_published__lte=date_now).order_by('-blog_date_published')[:3]
.....
return render(request, 'page.html', {
    'blog': blog_details_latest_entries,

这是模板代码中的限制:

{% for blog in blog|slice:"3" %}

哪个选项最适合性能。我怀疑 views.py 方法,但我希望有真正知识的人支持我的怀疑。

谢谢。

【问题讨论】:

  • 到目前为止,slice 是限制列表元素的最佳方法。
  • 同理。使用 Django 调试工具栏,Luke!
  • 限制视图中的qs。 SQL 语句在这两种情况下都会执行,但有限的 SQL 语句更快且不那么繁重。剪切模板中的 qs 将具有相同的输出,但到达那里的方式需要更长的时间,因为即使您只需要前三个元素,您也会加载所有数据。如果你想做更多的优化,我建议查找prefetch_related()values_list()。请重命名for loop 中的运行变量。它不应该是一样的。

标签: python django django-templates django-views


【解决方案1】:

正如@hansTheFranz 所说,Django 查询集是惰性的。这意味着只有在您请求时,查询才会访问数据库。

因此,在您的模板要求结果之前,它不会执行查询。所以,是的,你可以使用:

blog_latest_entries = BlogDetails.objects.filter(blog_date_published__lte=date_now).order_by('-blog_date_published')
{% for new in news|slice:":10" %}

和使用SELECT * FROM Customers LIMIT 3;一样

【讨论】:

    猜你喜欢
    • 2021-05-10
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2014-03-30
    • 2016-03-20
    相关资源
    最近更新 更多