19.聚合分組

 

聚合函數

  1. 全部的聚合函數都是放在django.db.models下面
  2. 集合函數不可以單獨的執行,須要放在一些能夠執行聚合函數的方法下面去執行,好比aggregate.示例代碼以下
    result = Book.objects.aggregate(Avg("price"))
  3. 聚合函數執行完成後,給這個聚合函數的值取個名字,取名字的規則:默認是filed+__+聚合函數名字造成的.好比以上代碼造成的名字叫作price__avg.若是不想使用默認的名字,那麼能夠在使用聚合函數的時候傳遞關鍵字參數進去,參數的名字就是聚合函數執行完成後的名字.示例代碼以下:
    result = Book.objects.aggregate(avg=Avg("price"))

    以上傳遞了關鍵字參數avg=AVG('price'),那麼之後Avg聚合函數執行完成的名字叫作avg
  4. aggregate:這個辦法不會返回一個QuerySet對象,而是返回一個字典.這個字典中的能夠就是聚合函數的名字,值就是聚合函數執行後的結果.
  5. aggregateannotate的相同和不一樣:javascript

    • 相同:這兩個方法均可以執行聚合函數。
    • 不一樣:
      • aggregate返回的是一個字典,在這個字典中存儲的是這個聚合函數執行的結果。而annotate返回的是一個QuerySet對象,而且會在查找的模型上添加一個聚合函數的屬性。
      • aggregate不會作分組,而annotate會使用group by子句進行分組,只有調用了group by子句,才能對每一條數據求聚合函數的值。
  6. Count:用來求某個數據的個數。好比要求全部圖書的數量,那麼能夠使用如下代碼:html

    result = Book.objects.aggregate(book_nums=Count("id"))


    而且Count能夠傳遞distinct=True參數,用來剔除那些重複的值,只保留一個。好比要獲取做者表中,不一樣郵箱的個數,那麼這時候能夠使用distinct=True。示例代碼以下:java

    result = Author.objects.aggregate(email_nums=Count('email',distinct=True))
  7. MaxMin:求指定字段的最大值和最小值。示例代碼以下:python

    result = Author.objects.aggregate(max=Max("age"),min=Min("age"))
  8. Sum:求某個字段值的總和。示例代碼以下:ios

    result = BookOrder.objects.aggregate(total=Sum('price'))


    aggregateannotate方法能夠在任何的QuerySet對象上調用。所以只要是返回了QuerySet對象,那麼就能夠進行鏈式調用。好比要獲取2018年度的銷售總額,那麼能夠先過濾年份,再求聚合函數。示例代碼以下:web

    BookOrder.objects.filter(create_time__year=2018).aggregate(total=Sum('price'))
相關文章
相關標籤/搜索