Django中的过滤器链上的count()

时间:2015-08-30 23:39:51

标签: python django

在Django中链接过滤器时,从单个过滤器计算结果记录的最有效方法是什么?不运行过滤器两次。

 results = my_model.objects.all() 
 for filter in my_filters:
      results = results.filter(filter.get_filter_string())
      individual_num_records_affected = my_model.objects.filter(filter.get_filter_string())

1 个答案:

答案 0 :(得分:3)

由于您只需要在每个步骤中获得结果数量,因此在查询集上使用.count()会更有效。

来自querysets documentation

  

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

您不应该使用.len(),因为它会将所有记录加载到Python对象中,并在您不需要的结果上调用len()。您只需要记录数量,.count()将是更好的选择。

另外,请记住查询集的评估是懒惰的

  

在内部,可以构造,过滤,切片和查询QuerySet   通常在没有实际访问数据库的情况下传递。没有   数据库活动实际发生,直到您做一些评估   查询集。

因此,在您尝试使用查询集的结果之前,将不会评估查询集,即不会发生数据库命中。

在您尝试使用results = results.filter(filter.get_filter_string())之前,语句results不会访问数据库。 您可以多次对查询集.filter()进行操作,但在您不使用它之前,不会有数据库命中。