【问题标题】:django filter and exclude effect on performance?django过滤和排除对性能的影响?
【发布时间】:2011-12-24 21:59:06
【问题描述】:

我从 django 文档中阅读了过滤器和排除,但我想知道我是否会使用以下代码:

Entry.objects.filter(
   ...     headline__startswith='What'
  ... ).exclude(
 ...     pub_date__gte=datetime.now()
 ... ).filter(
 ...     pub_date__gte=datetime(2005, 1, 1)
 ... )

那么,会导致 1 个查询还是 4 个查询?它会先查询并获取所有对象,然后在从 mysql/db 获取所有记录后进行过滤和排除,还是全部在 mysql/db 级别完成。因为如果它不在数据库级别上完成,那么它可能会导致性能问题。这就是为什么我想知道这将过滤和排除应用程序级别或数据库级别的工作?

【问题讨论】:

    标签: django django-models django-database


    【解决方案1】:

    我得到了我的问题的答案,即: 查询将只执行一次,如自己的 django 文档中所述:

    QuerySet 是惰性的——创建 QuerySet 的行为不涉及任何数据库活动。您可以整天将过滤器堆叠在一起,在评估 QuerySet 之前,Django 不会实际运行查询 和 虽然这看起来像三个数据库命中,但实际上它只命中数据库一次,在最后一行(打印 q)。通常,在您“请求”查询集的结果之前,不会从数据库中获取它们。执行此操作时,将通过访问数据库来评估 QuerySet。 有关评估发生时间的更多详细信息,请参阅"When QuerySets are evaluated"

    【讨论】:

      【解决方案2】:

      只是为了稍微补充一下 Hafiz 的答案,我把他解释的代码贴在这里。 (虽然你提供了链接,但当你提到print(q) 时,我有点失落!)

      >>> q = Entry.objects.filter(headline__startswith="What")
      >>> q = q.filter(pub_date__lte=datetime.date.today())
      >>> q = q.exclude(body_text__icontains="food")
      >>> print(q)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-15
        • 2018-06-21
        • 1970-01-01
        • 2020-06-22
        • 2013-08-30
        • 2021-03-09
        相关资源
        最近更新 更多