Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

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

最後更新:2025年1月7日Python

本文為 留言評分功能 系列教學,第 11 篇:

  1. 使用 Django + Tailwind + Alpine.js 實作「五顆星評分」功能教學
  2. Django validators 驗證器完整教學
  3. Django PositiveSmallIntegerField 新手指南
  4. 在 esbuild 專案中整合 Alpine.js 的完整指南
  5. 使用 Alpine.js 建立星星評分表單 — 新手指南
  6. 深入理解 Alpine.js 中的 template 標籤使用指南
  7. Django 網站如何新增「星星評分」功能 — 後端接收邏輯
  8. Django 表單:如何讓使用者選擇性提交星星評分與留言
  9. Django 如何限制同一使用者只能對同一服務留言一次?
  10. Django 留言軟刪除邏輯|程式碼解析
  11. Django 計算評分摘要教學 — 使用 ORM 進行星等統計 👈 所在位置
  12. Python Django 使用 annotate、aggregate 統計教學
  13. 使用 Alpine.js 實作星級評分分佈 – 詳細教學
  14. Alpine.js 與 Tailwind CSS 動態樣式解析:為什麼有些樣式無法生效?
  15. Django 中使用 annotate() 與 Avg() 進行平均評分計算

在 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() 計算整個 QuerySet 中 rating 欄位的平均分數。
  • .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
評論數12
評論數3
評論數0
評論數0
評論數0
  • 總評論數: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 進行資料統計。

目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

Python

目錄

  • 範例程式碼
  • 程式碼目標
  • total_reviews — 計算總評論數
  • 解釋
  • 範例輸出
  • average_rating — 計算平均分數
  • 解釋
  • 範例輸出
  • 建立 1~5 星的分佈
  • rating_summary — 計算每個評分的數量
  • 解釋
  • 範例輸出
  • rating_distribution — 建立 1 到 5 星的分佈
  • 解釋
  • 範例輸出
  • 將 rating_summary 更新到分佈字典
  • 解釋
  • 範例輸出
  • 完整範例結果
  • 總結