django - 显示模板中查询集的长度

问题描述 投票:0回答:4

在我的 html 文件中,如何输出我正在使用的查询集的大小(用于调试目的)

我已经尝试过了

{{ len(some_queryset) }}

但这没有用。格式是什么?

django
4个回答
103
投票

尝试一下

{{ some_queryset.count() }}

这比使用 len (可以用

{{ some_queryset.__len__ }}
调用)更好,因为它优化了后台生成的 SQL,仅检索记录数而不是记录本身。


36
投票
模板中的

some_queryset.count()
{{some_queryset.count}}

不要使用

len
,效率低得多。数据库应该完成这项工作。请参阅有关
count()
的文档。

但是,考虑到缓冲区的建议,如果您打算无论如何都迭代记录,您不妨使用

len
,这将涉及解析查询集并使结果行驻留在主内存中 - 这不会浪费,因为无论如何你都会访问这些行。它实际上可能会更快,具体取决于数据库连接延迟,但您应该始终进行测量。


16
投票

只是为了强调上面的@Yuji'Tomita'Tomita 评论作为单独的答案:

有一个名为

length
的过滤器,可以对任何内容调用
len()

所以你可以使用:

{{ some_queryset|length }}

15
投票

接受的答案并不完全正确。您是否应该使用 len() (或模板中的长度过滤器)与 count() 取决于您的用例。

如果 QuerySet 仅存在用于计算行数,请使用 count()。

如果 QuerySet 在其他地方使用,即在循环中,请使用 len() 或 |length。这里使用 count() 会发出另一个 SELECT 查询来计算行数,而 len() 只是计算 QuerySet 中缓存结果的数量。

来自文档

请注意,如果您想要 QuerySet 中的项目数,并且还从中检索模型实例(例如,通过迭代它),那么使用 len(queryset) 可能会更有效,这不会导致额外的数据库查询就像 count() 一样。

虽然看起来您已经使用 prefetch_lated() 预先加载了相关对象,但您可以安全地使用 count() 并且 Django 将足够聪明地使用缓存的数据,而不是执行另一个 SELECT 查询。

© www.soinside.com 2019 - 2024. All rights reserved.