Как сохранить звезды в модели 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()
вернется, если по какой-либо причине ничего не найдено.