Как получить среднее значение 5 оценок пользователя? Django
Я делаю сайт для оценки фильмов с использованием Djnago. Этот сайт позволяет каждому пользователю оставлять комментарии к фильму. В это время я буду выставлять 5-балльную оценку. Как я могу получить среднее значение 5-балльных оценок всех пользователей, прокомментировавших фильм? Ниже приведена модель комментария.
from datetime import datetime
from accounts.models import CustomUser
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
# Create your models here.
class Comment(models.Model):
comment = models.TextField(max_length=1000)
stars = models.FloatField(blank=False,null=False,default=0, validators=[MinValueValidator(0.0),
MaxValueValidator(5.0)])
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE,)
movie_id = models.IntegerField()
created_at = models.DateTimeField(default=datetime.now)
updated_at = models.DateTimeField(auto_now=True)
Должно работать что-то вроде этого, хотя я не тестировал это:
class Movie(models.Model):
...
def get_comments(self):
return Comment.objects.filter(movie_id=self.id)
def average_stars(self):
comments = self.get_comments()
n_comments = comments.count()
return sum([comment.stars for comment in comments]) / n_comments
Затем вы можете получить доступ к среднему звездному рейтингу любого фильма, используя:
avg_star_rating = movie_obj.average_stars()
Также рассмотрите возможность изменения поля movie_id
вашей модели Comments
на ForeignKey
. Что-то вроде этого:
class Comment(models.Model):
comment = models.TextField(max_length=1000)
stars = models.FloatField(
blank=False,
null=False,
default=0,
validators=[MinValueValidator(0.0),
MaxValueValidator(5.0)]
)
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE,)
movie = models.ForeignKey(Movie, on_delete.CASCADE)
created_at = models.DateTimeField(default=datetime.now)
updated_at = models.DateTimeField(auto_now=True)