django过滤并排除对性能的影响?

时间:2011-12-24 21:59:06

标签: django django-models django-database

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

为了完成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)