Django如何计算指定电影下所有用户5级评分的平均值
Django 实现指定电影评论评分平均值计算
实现步骤
1. 导入ORM聚合工具
在视图文件顶部导入Django内置的平均聚合函数:
from django.db.models import Avg
2. 补全平均值计算代码
替换GET请求分支中原有重复查询评论、average未赋值的代码段:
# 筛选当前电影的所有评论,查询集可复用以减少数据库查询次数 movie_comments = Comment.objects.filter(movie_id=movie_id) # 数据库层聚合计算评分平均值,无评论时兜底为0.0避免空值错误 average = movie_comments.aggregate(average_score=Avg('stars'))['average_score'] or 0.0 # 按需保留小数位,例:保留1位小数 average = round(average, 1) # 按评论创建时间倒序返回,替换原reversed写法,数据库层排序性能更优 comments = movie_comments.order_by('-created_at')
逻辑说明
- 用ORM的
aggregate聚合方法直接在数据库端完成平均值计算,不需要把全量评论数据加载到Python内存中计算,评论量级大时性能优势非常明显 - 末尾的
or 0.0是边界处理:当当前电影没有任何评论时,聚合返回值为None,该写法会自动将平均值设为0,避免模板渲染时出现类型错误 - 原代码中
reversed(Comment.objects.filter(...))的写法会将QuerySet转为列表后在内存中反转,数据量大时内存占用高,替换为order_by('-created_at')直接在数据库完成排序,执行效率更高
可选优化提示
你当前Comment模型的user字段设置为OneToOneField,该配置会限制一个用户全站只能发布1条评论,不符合常规电影评价网站的产品逻辑。如果需要支持单用户给多部电影打分评论,建议将该字段改为外键:
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='user_comments')
内容的提问来源于stack exchange,提问作者user18970300
相关产品推荐
相关产品推荐

