计算5星级的平均评分

时间:2020-03-19 06:20:07

标签: django

我想获得与用户相关的所有评分的平均值

UserRating类(models.Model):

User_Name=models.ForeignKey(MyUser,on_delete=models.CASCADE)
Rating = models.IntegerField(
    default=1,
    validators=[MaxValueValidator(5), MinValueValidator(1)]
 )

def __str__(self):
    return str(self.User_Name)

UserRatingViewSet(viewsets.ViewSet)类:

def create(self,request):
    try:
        User_Name=request.data.get('User_Name')
        Rating=request.data.get('Rating')
        new=UserRating()
        new.User_Name=MyUser.objects.get(user_name=User_Name)
        new.Rating=Rating
        new.save()

        return Response({"Data":"Delivered"})
    except Exception as error:
        return Response({"message":str(error),"success":False})

def list(self,request):
    ashu=UserRating.objects.all()
    print(ashu)
    a=[]
    for  i in ashu:
        a.append({
            "User_Name":i.User_Name.user_name,
            "Rating":i.Rating,
        })
    return Response({"message":a})

2 个答案:

答案 0 :(得分:1)

要获取每个用户的所有平均值列表,您可以执行以下操作:

from django.db.models import Avg
user_ratings = UserRating.objects.all().values('User_Name').order_by('User_Name').annotate(rating_average=Avg('Rating'))

建议不要使用for,这样,由于直接在数据库中完成,因此性能更好。

答案 1 :(得分:0)

ashu = UserRating.objects.all()
dict = {}
for line in ashu:
    if dict.get(line.User_Name.user_name):
        dict[line.User_Name.user_name] = (dict[line.User_Name.user_name] + line.Rating)/2
    else:
        dict.update({line.User_Name.user_name:line.Rating})
print(dict)

喜欢吗?