GROUB BY ... COUNTSUM Django ORM 等價物

我們可以在 Django ORM 上執行 GROUP BY ... COUNTGROUP BY ... SUM SQL 等價查詢,分別使用 annotate()values()order_by()django.db.modelsCountSum 方法:

讓我們的模型是:

   class Books(models.Model):
       title  = models.CharField()
       author = models.CharField()
       price = models.FloatField()

GROUP BY ... COUNT

  • 讓我們假設我們想要計算 Books 表中每個不同作者存在多少個書物件:

    result = Books.objects.values('author')
                          .order_by('author')
                          .annotate(count=Count('author'))
    
  • 現在 result 包含一個包含兩列的查詢集:authorcount

      author    | count
    ------------|-------
     OneAuthor  |   5
    OtherAuthor |   2
       ...      |  ...
    

GROUB BY ... SUM

  • 讓我們假設我們想要總結我們的 Books 表中存在的每個不同作者的所有書籍的價格:

     result = Books.objects.values('author')
                           .order_by('author')
                           .annotate(total_price=Sum('price'))
    
  • 現在 result 包含一個包含兩列的查詢集:authortotal_price

      author    | total_price
    ------------|-------------
     OneAuthor  |    100.35
    OtherAuthor |     50.00
        ...     |      ...