Рассчитать Средний рейтинг 5 звезд - PullRequest
1 голос
/ 19 марта 2020

я хочу получить среднее значение всех оценок, связанных с пользователем

класс 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 ]

1 голос
/ 19 марта 2020

Чтобы получить список всех средних значений для каждого пользователя, вы можете сделать:

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

Использование for не рекомендуется, в этом случае производительность лучше, потому что она выполняется непосредственно в базе данных.

0 голосов
/ 19 марта 2020
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)

как это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...