【问题标题】:django - show the length of a queryset in a templatedjango - 在模板中显示查询集的长度
【发布时间】:2012-05-28 13:09:10
【问题描述】:

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

我试过了

{{ len(some_queryset) }}

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

【问题讨论】:

  • 有一个名为length 的过滤器可以在任何事情上调用 len()。 {{ any_iterable|length }}
  • @Yuji'Tomita'Tomita 所以你使用了some_queryset.all|length?就生成的 SQL 而言,这是最优的吗? some_queryset.count 使用 SELECT COUNT(*)... 而不是选择所有模型字段。我不知道这在性能方面有多重要,我猜对于具有大 query_set 的东西这可能很重要?
  • @AJP 是的。如果你只得到计数,那么做 some_queryset.count。如果它已经被评估过,|length 可以为你节省一个 db hit。
  • 谢谢@Yuji'Tomita'Tomita

标签: django


【解决方案1】:

试试{{ some_queryset.count }}。

这比使用 len(可以用 {{ some_queryset.__len__ }} 调用)要好,因为它优化了后台生成的 SQL,只检索记录数而不是记录本身。

【讨论】:

  • 过滤器“长度”怎么样?是一样的吗? docs.djangoproject.com/en/dev/ref/templates/builtins/#length
  • 不一样!你确实应该使用长度,检查我的答案:stackoverflow.com/a/18578147/267719
  • 到目前为止,django 不允许在模板中使用__len__。
  • 仅供参考,每次连续调用模板中的{{ some_queryset.count }},都会发出另一个数据库调用。如果这是您将多次显示的值,请将值存储在视图中并将其传递给模板。
【解决方案2】:

some_queryset.count() 或 {{some_queryset.count}} 在您的模板中。

不要使用len,它的效率要低得多。数据库应该做这项工作。请参阅有关count() 的文档。

但是,考虑到缓冲区的建议,如果您打算遍历记录,您不妨使用len,这将涉及解析查询集并使结果行驻留在主内存中 - 这不会去浪费,因为无论如何您都会访问这些行。它实际上可能更快,具体取决于数据库连接延迟,但您应该始终测量。

【讨论】:

  • dont use len, it is much less efficient :是的,除非你无论如何都要遍历你的查询集。在这种情况下,首选len 而不是count。 Read More
【解决方案3】:

只是为了突出显示上面的@Yuji'Tomita'Tomita 评论作为单独的答案:

有一个名为length 的过滤器可以在任何事情上调用len()。

所以你可以使用:

{{ some_queryset|length }}

【讨论】:

    【解决方案4】:

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

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

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

    来自docs:

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

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

    【讨论】:

      【解决方案5】:

      虽然我尝试使用 Django (3.8.3) 显示关注者数量,但我解决了“计数”问题。

       <p>{{profile.following.count}}</p>
      

      【讨论】:

      • 使用.count 已经在接受的答案中提到,第一行...
      猜你喜欢
      • 2023-03-07
      • 2021-11-17
      • 2020-10-17
      • 2020-06-09
      • 2021-10-03
      • 2012-01-22
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      相关资源
      最近更新 更多