Как сохранить звезды в модели Movie?

Чего я хочу достичь.

Я хочу сохранить звезды в модели Movie при использовании функции def average_stars(). Я хочу поместить число в звезды и сохранить его при вызове функции movie, как показано ниже. Что мне делать?

class Movie(models.Model):
    id = models.CharField(primary_key=True, editable=False,
                          validators=[alphanumeric],max_length = 9999)
    stars = models.FloatField(
                    blank=False,
                    null=False,
                    default=0, 
                    validators=[MinValueValidator(0.0),
                     MaxValueValidator(10.0)]
                     )
    def get_comments(self):
        return Comment_movie.objects.filter(movie_id=self.id)
    
    def average_stars(self):
        comments = self.get_comments()
        n_comments = comments.count()

        if n_comments:
            self.stars = sum([comment.stars for comment in comments]) / n_comments
        else:
            self.stars = 0
        return self.stars

Во-первых, вы можете получить доступ к связанным комментариям гораздо более простым способом, используя self.relation_set.all() и т.д., а не импортировать и фильтровать по другому связанному объекту. Во-вторых, ваш код для получения среднего значения является питоническим, тогда как вы можете использовать ORM Django для агрегирования среднего рейтинга звезд, см. ниже:

def average_stars(self):
    avg = self.comment_set.aggregate(Avg('stars')).get('stars__avg')
    self.stars = avg
    salf.save()
    return avg or 0

Этот код также устанавливает значение звезд экземпляра, сохраняет его и возвращает среднее значение туда, откуда была вызвана функция.

Edit - добавлено return avg or 0, поскольку вы хотите поместить ноль в поле, а не None, который .get() вернется, если по какой-либо причине ничего не найдено.

Вернуться на верх