【问题标题】:Do using queryset.count() caches the queryset?使用 queryset.count() 缓存查询集吗?
【发布时间】:2022-01-14 12:27:12
【问题描述】:

我正在我的端点中进行一些过滤,并且仅当过滤的查询集包含超过 30 个项目时才会应用其中一个过滤器。

yesterday_date = timezone.now() - timezone.timedelta(days=1)
if query_dict.get("active"):
    active_query = cleaned_query.filter(created_at__gt=yesterday_date)
    if active_query.count() > 30:
        cleaned_query = active_query
    else:
        cleaned_query = cleaned_query[:30]

我的疑问是,.count() 方法是否已经评估并缓存了查询集,还是应该使用 len(queryset) 来避免另一个数据库命中,以防它大于 30?

【问题讨论】:

  • 代码看起来很奇怪,如果数字大于30,你想要所有项目,否则你只想要前30?这没有多大意义,因为在 else 的情况下,我们已经知道该数字小于 30,因此切片不会有任何区别。
  • cleaned_query[:30] 引用另一个查询集。
  • 有一个名为"Django Debug Toolbar"的工具,可以显示执行了多少次和哪些SQL查询。

标签: python django postgresql django-orm


【解决方案1】:

如果你查看 django 的关于 When Querysets Are Evaluated 的文档

您会看到一些关于计数的信息...

注意:如果只需要确定集合中的记录数 (并且不需要实际的对象),它更有效 使用 SQL 的 SELECT COUNT(*) 在数据库级别处理计数。 正是出于这个原因,Django 提供了一个 count() 方法。

所以count() 不会评估集合,而len() 会。

【讨论】:

    猜你喜欢
    • 2019-01-23
    • 2014-06-20
    • 1970-01-01
    • 2014-08-12
    • 2017-06-04
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    相关资源
    最近更新 更多