You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:33:34