1

我从 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 级别完成。因为如果它不在数据库级别上完成,那么它可能会导致性能问题。这就是为什么我想知道这将过滤和排除应用程序级别或数据库级别的工作?

4

2 回答 2

2

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

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

于 2011-12-24T22:14:30.703 回答
1

只是为了稍微完成 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)
于 2013-05-17T09:55:02.200 回答