在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())
答案 0 :(得分:3)
由于您只需要在每个步骤中获得结果数量,因此在查询集上使用.count()
会更有效。
注意:如果您只需要确定集合中的记录数 (并且不需要实际的对象),它的效率要高得多 使用SQL
SELECT COUNT(*)
处理数据库级别的计数。 正是出于这个原因,Django提供了count()
方法。
您不应该使用.len()
,因为它会将所有记录加载到Python对象中,并在您不需要的结果上调用len()
。您只需要记录数量,.count()
将是更好的选择。
另外,请记住查询集的评估是懒惰的。
在内部,可以构造,过滤,切片和查询QuerySet 通常在没有实际访问数据库的情况下传递。没有 数据库活动实际发生,直到您做一些评估 查询集。
因此,在您尝试使用查询集的结果之前,将不会评估查询集,即不会发生数据库命中。
在您尝试使用results = results.filter(filter.get_filter_string())
之前,语句results
不会访问数据库。 您可以多次对查询集.filter()
进行操作,但在您不使用它之前,不会有数据库命中。