Django 計算評分摘要教學 — 使用 ORM 進行星等統計

更新日期: 2025 年 1 月 7 日

在 Django 開發中,我們經常需要計算用戶對某項服務的評分統計,例如總評論數、平均分數以及各星等的分佈情況。

這篇文章將透過一段完整的 Django ORM 程式碼,帶你逐步理解如何使用 annotate()aggregate() 等方法來計算這些數據,並附上詳細解釋與範例輸出。


範例程式碼

from django.db.models import Count, Avg

# ✅ 計算評分摘要
total_reviews = comments.count()
average_rating = comments.aggregate(Avg('rating'))['rating__avg']

# ✅ 建立 1~5 星的分佈 (確保所有星等都存在)
rating_summary = comments.values('rating').annotate(count=Count('rating'))
rating_distribution = {i: 0 for i in range(1, 6)}
for entry in rating_summary:
    rating_distribution[entry['rating']] = entry['count']

程式碼目標

這段程式碼的主要目標是計算出:

  1. 每個星等的評論數量 (rating_summary)
  2. 總評論數 (total_reviews)
  3. 平均分數 (average_rating)
  4. 各星等的完整分佈 (rating_distribution)

total_reviews — 計算總評論數

total_reviews = comments.count()

解釋

  • .count() 是 Django ORM 提供的內建方法,直接計算目前 QuerySet 中的總筆數。

範例輸出

15

average_rating — 計算平均分數

average_rating = comments.aggregate(Avg('rating'))['rating__avg']

解釋

  • .aggregate(Avg('rating'))
    • 使用 Avg() 計算整個 QuerySetrating 欄位的平均分數。
  • .aggregate() 會回傳一個字典,因此需要使用 ['rating__avg'] 來存取結果。

範例輸出

4.6

建立 1~5 星的分佈

rating_summary — 計算每個評分的數量

rating_summary = comments.values('rating').annotate(count=Count('rating'))

解釋

  • comments.values('rating')
    • rating 欄位的數據進行分組 (每個星等作為一組)。
  • .annotate(count=Count('rating'))
    • 使用 Count 函數計算每個分組中 rating 的數量,並將結果儲存在 count 鍵中。

範例輸出

[
    {'rating': 5, 'count': 12}, 
    {'rating': 4, 'count': 3}
]

rating_distribution — 建立 1 到 5 星的分佈

rating_distribution = {i: 0 for i in range(1, 6)}

解釋

  • 建立一個 Python 字典,預設將 1 到 5 星的數量都設為 0
  • 即使某個星等沒有評論,也能正確顯示為 0

範例輸出

{1: 0, 2: 0, 3: 0, 4: 0, 5: 0}

延伸閱讀:Python 字典推導式詳解:新手指南

rating_summary 更新到分佈字典

for entry in rating_summary:
    rating_distribution[entry['rating']] = entry['count']

解釋

  • 這段程式碼會迭代 rating_summary (已計算的星等數量清單)。
  • 將每個星等的數量更新到 rating_distribution 字典中。

範例輸出

rating_summary = [{'rating': 5, 'count': 12}, {'rating': 4, 'count': 3}]
rating_distribution = {1: 0, 2: 0, 3: 0, 4: 3, 5: 12}

延伸閱讀:Python dict.items() 方法完整教學


完整範例結果

星等評論數
512
43
30
20
10
  • 總評論數15
  • 平均分數4.6
  • 星等分佈{1: 0, 2: 0, 3: 0, 4: 3, 5: 12}

總結

這段 Django 程式碼透過 ORM 操作完成了以下幾個重要步驟:

  1. 計算每個評分的數量 (annotate()Count)
  2. 計算總評論數 (count())
  3. 計算平均分數 (aggregate()Avg)
  4. 建立星等分佈 (for 迴圈 + dict)

希望這篇文章幫助你更清楚了解如何使用 Django ORM 進行資料統計。

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *