django数据查询优化annotate和aggregate

django查询QuerySet集合的方式,常用到的有filter/Q函数/exclude等方式,数据量比较小的时候还可以,但是如果数据量很大,而且查询比较复杂,那么如果还是使用多个filter进行查询效率就会很低。

提高查询数据库效率的方案有两种:

第一种,是使用原生的SQL语句来进行查询,这样的优点在于能够完全按照开发者的意图来执行,效率会很高,但是缺点也很明显:1.开发者需要非常熟悉SQL语句,加大开发者的工作量,同时,夹杂着SQL的项目也不利于以后程序的维护,增大程序的耦合度。2.若查询条件是动态变化的,则会使开发变得更加困难。

django为了解决这一难题,提供了aggregate(聚合函数)和annotate(在aggregate的基础上进行GROUP BY操作)。

下面,就来介绍第二种方法。

理解aggregate和annotate的关键在于理解SQL中的聚合函数:以下摘自百度百科:SQL基本函数,聚合函数对一组值执行计算,并返回单个值。除了 COUNT 以外,聚合函数都会忽略空值。 常见的聚合函数有AVG / COUNT / MAX / MIN /SUM 等。

django 中 annotate和aggregate的区别:

aggregate 计算整个queryset的值,相当于count();annotate 对于 queryset 中的每个值在指定的属性上进行汇总,相当于group_by。

aggregate:

>>> Book.objects.aggregate(average_price=Avg('price'))
>>> {'average_price': 34.35}
# 返回一个包含所有书价的平均值字典

annotate:

>>> q = Book.objects.annotate(num_authors=Count('authors'))
>>> q[0].num_authors
2
>>> q[1].num_authors
1
# q是books的queryset, 但是每本书按照作者的数量进行了聚合.

转自: http://blog.51cto.com/utrace/1850610

上一篇:python之random函数

下一篇:如何提高服务器并发处理能力