如何在Django中统计特定游戏各星级评分的用户数量
实现特定游戏的评分统计功能
针对你的ActionGameReview模型,有几种高效的方式实现特定游戏的各星级评分用户数量统计,以下是具体方案:
方案一:使用Django ORM聚合+条件过滤(推荐)
这种方式通过一次数据库查询就能获取所有星级的统计数据,效率最优。如果需要统计唯一用户(避免同一用户多次评分重复计数),记得添加distinct=True。
from django.db.models import Count, Q # 先获取目标游戏对象,这里以游戏名为"Template run"为例 target_game = ActionGame.objects.get(game_name="Template run") # 统计各星级的用户数量 rating_stats = target_game.reviews.aggregate( star_1=Count('user', filter=Q(rating=1), distinct=True), star_2=Count('user', filter=Q(rating=2), distinct=True), star_3=Count('user', filter=Q(rating=3), distinct=True), star_4=Count('user', filter=Q(rating=4), distinct=True), star_5=Count('user', filter=Q(rating=5), distinct=True) ) # 按示例格式输出结果 print(f"游戏:{target_game.game_name}") print("评分") print(f"1星:{rating_stats['star_1']}人,2星:{rating_stats['star_2']}人,3星:{rating_stats['star_3']}人,4星:{rating_stats['star_4']}人,5星:{rating_stats['star_5']}人")
如果不需要去重(统计所有评分记录数,而非用户数),去掉distinct=True即可。
方案二:分组统计后补全数据
通过分组查询获取已存在的星级统计,再补全1-5星的完整数据,适合需要灵活处理分组结果的场景:
from django.db.models import Count target_game = ActionGame.objects.get(game_name="Template run") # 按rating分组,统计每个星级的用户数(去重) rating_counts = target_game.reviews.values('rating').annotate(user_count=Count('user', distinct=True)).order_by('rating') # 初始化1-5星的统计字典,默认值为0 rating_stats = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0} # 将查询结果填充到字典中 for item in rating_counts: rating_stats[item['rating']] = item['user_count'] # 输出结果 print(f"游戏:{target_game.game_name}") print("评分") print(f"1星:{rating_stats[1]}人,2星:{rating_stats[2]}人,3星:{rating_stats[3]}人,4星:{rating_stats[4]}人,5星:{rating_stats[5]}人")
注意事项
- 如果你的业务允许用户对同一游戏多次评分,务必使用
distinct=True来统计唯一用户数,否则会统计所有评分记录的数量。 - 若目标游戏可能不存在,建议用
get_object_or_404替代get,避免抛出DoesNotExist异常:from django.shortcuts import get_object_or_404 target_game = get_object_or_404(ActionGame, game_name="Template run")
内容的提问来源于stack exchange,提问作者Byansi
相关产品推荐
相关产品推荐

