1、聚合查詢與分組查詢(很重要!!!)django
聚合查詢:aggregate(*args, **kwargs),只對一個組進行聚合函數
from django.db.models import Avg,Sum,Count,Max,Min # 一、查詢全部圖書的平均價格 print(models.Book.objects.all().aggregate(Avg("price")))
aggregate()是QuerySet 的一個終止子句(也就是返回的再也不是一個QuerySet集合的時候),意思是說,它返回一個包含一些鍵值對的字典。鍵的名稱是聚合值的標識符,值是計算出來的聚合值。鍵的名稱是按照字段和聚合函數的名稱自動生成出來的。若是你想要爲聚合值指定一個名稱,能夠向聚合子句提供它。spa
from django.db.models import Avg,Sum,Count,Max,Min # 一、查詢全部圖書的平均價格 print(models.Book.objects.all().aggregate(avgprice = Avg("price")))
若是你但願生成不止一個聚合,你能夠向aggregate()子句中添加另外一個參數。因此,若是你也想知道全部圖書價格的最大值和最小值,能夠這樣查詢:code
print(models.Book.objects.all().aggregate(Avg("price"),Max("price"),Min("price"))) #打印的結果是: {'price__avg': 174.33333333333334, 'price__max': Decimal('366.00'), 'price__min': Decimal('12.00')}
分組查詢 :annotate():爲QuerySet中每個對象都生成一個獨立的彙總值。對象
是對分組完以後的結果進行的聚合blog
一、統計每一本書的做者個數排序
# 方式一: print(models.Book.objects.all().annotate(authorNum = Count("authorlist__name")).values("authorNum")) # 方式二: booklist =models.Book.objects.all().annotate(authorNum=Count("authorlist__name")) for book_obj in booklist: print(book_obj.title,book_obj.authorNum)
二、統計每個出版社最便宜的書ci
# 二、統計每個出版社的最便宜的書 # 方式一: print(models.Book.objects.values("publish__name").annotate(nMinPrice=Min('price'))) 注意:values內的字段即group by的字段,,也就是分組條件 # 方式二: print(models.Publish.objects.all().annotate(minprice=Min("book__price")).values("name","minprice")) # 方式三 publishlist = models.Publish.objects.annotate(minprice = Min("book__price")) for publish_obj in publishlist: print(publish_obj.name,publish_obj.minprice)
三、統計每一本以py開頭的書籍的做者個數:it
print(models.Book.objects.filter(title__startswith="py").annotate(authNum = Count("authorlist__name")).values("authNum"))
四、統計不止一個做者的圖書:class
print(models.Book.objects.annotate(num_authors=Count('authorlist__name')).filter(num_authors__gt=1).values("title","num_authors"))
五、根據一本圖書做者數量的多少對查詢集QuerySet進行排序:
print(models.Book.objects.all().annotate(authorsNum=Count("authorlist__name")).order_by("authorsNum"))
六、查詢各個做者出的書的總價格:
# 方式一 print(models.Author.objects.all().annotate(priceSum = Sum("book__price")).values("name","priceSum")) # 方式二 print(models.Book.objects.values("authorlist__name").annotate(priceSum=Sum("price")).values("authorlist__name","priceSum"))