Как получить среднее значение 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)
Вернуться на верх