You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:57:21