这里我们使用聚合进行计算
>>> avg = Book.objects.aggregate(average_price=Avg('price'))
{'average_price': 34.35}
但为什么我们不在上面使用下面的概念呢。
a = Books.objects.all()
Avg = sum([x.price for x in a])/len(a)
34.35
我想知道使用聚合而不是第二过程。
Book.objects.aggregate(average_price=Avg('price'))
-它被转换为等效的SQL查询,并在DB上执行,并直接获取聚合数据。这更快。
而使用第二种方法
- 您从DB中获取所有对象
- 使用
sum()
计算价格总和,然后 - 使用
len()
求出a
的长度,然后 - 使用除法来获得结果
第二种方法比第一种方法有更多的开销,因为涉及到函数调用、执行除法、将对象加载到列表等,
第一项将计算数据库端的平均值。因此,这意味着您要执行一个确定平均值的查询。这通常更快,因为数据库是为了计算这一点而设计的,而且更重要:它将减少数据库和Django/Python层之间的带宽,因为数据库只返回一个行:一个包含average_price
的行。
在第二个代码片段中,您将从数据库中检索所有项,并使用Django对这些项进行反序列化。因此,这意味着,如果有1000条记录,则需要一些时间才能加载所有项目。然后我们发现我们只对查询集中项目的价格和长度感兴趣。
如果记录的数量真的很高,例如100000,那么您的Python Web服务器甚至可能会耗尽内存。