
聚合查询和分组查询
聚合查询
aggregate(),它是QuerySet的一个终止子句,意思就是,会返回一个包含一些键值对的字典 。
键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。
用到的内置函数:
1 | from django.db.models import Avg, Sum, Max, Min, Count
|
示例:
1 2 3 4 | from django.db.models import Avg,Sum,Max,Min, Count
查询所有书籍的平均价格,价格,书的数量
res = models.Book.objects.all().aggregate(Avg( 'price' ), Max( 'price' ), Count ( 'title' ))
print (res) # { 'price__avg' : 56.6, 'price__max' : Decimal( '87.00' ), 'title__count' : 5}
|
可以给聚合值指定一个名称,用于使用该聚合值。
如果你想要为聚合值指定一个名称,可以向聚合子句提供它。
1 2 | >>> models.Book.objects.aggregate(average_price=Avg( 'price' ))
{ 'average_price' : 13.233333}
|
相关推荐:《Python视频教程》
分组查询
示例:
统计每一个出版社的出版的书平均价格
1 2 3 4 | res = models.Publish.objects.annotate(avg_price=Avg( 'book__price' )).values( 'name' , 'avg_price' )
print (res)
# <QuerySet [{ 'name' : '东方出版社' , 'avg_price' : 46.0}, { 'name' : '南方出版社' , 'avg_price' : 77.0}, { 'name' :
'北方出版社' , 'avg_price' : 37.0}]>
|

统计出每个出版社买的最便宜的书的价格
1 2 3 4 5 6 | # <QuerySet [{ 'name' : '东方出版社' , 'avg_price' : 46.0}, { 'name' : '南方出版社' , 'avg_price' : 77.0}, { 'name' :
'北方出版社' , 'avg_price' : 37.0}]>
res = models.Publish.objects.annotate(min_price=Min( 'book__price' )).values( 'name' , 'min_price' )
print (res)
# <QuerySet [{ 'name' : '东方出版社' , 'min_price' : Decimal( '44.00' )}, { 'name' : '南方出版社' , 'min_price' : Decimal
( '67.00' )}, { 'name' : '北方出版社' , 'min_price' : Decimal( '37.00' )}]>
|
统计不止一个作者的图书
1 2 3 | res = models.Book.objects.annotate(author_num= Count ( 'author' )).filter(author_num__gt=1).values( 'title' )
print (res)
# <QuerySet [{ 'title' : '西厢记' }]>
|