如何在调用average_stars方法时保存Movie模型的stars字段值?
解决方案
你只需要在average_stars()方法计算出评分后,调用模型的save()方法,就能把更新后的stars字段保存到数据库中。修改后的代码如下:
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 # 新增保存操作,指定仅更新stars字段提升性能 self.save(update_fields=['stars']) return self.stars
性能优化建议
上面的实现会将所有评论数据加载到内存中计算总和,当评论数量较多时效率偏低。推荐使用Django的聚合函数Avg直接在数据库层面完成平均值计算,减少内存占用:
from django.db.models import Avg class Movie(models.Model): # 字段定义保持不变... def average_stars(self): # 数据库层面直接计算平均值 avg_result = self.get_comments().aggregate(avg_stars=Avg('stars')) self.stars = avg_result['avg_stars'] or 0.0 self.save(update_fields=['stars']) return self.stars
内容的提问来源于stack exchange,提问作者user19553515
相关产品推荐
相关产品推荐

