Django评分的平均值

时间:2020-03-09 14:12:12

标签: python django

我在学校使用django和python开发应用程序。它是一个用于撰写评论和评分电影的应用程序。我想实施一个评分系统,因此我可以根据评论中给出的评分显示电影的平均评分。目前,此代码以降序给出所有评论的评分,而不是平均值。就像我对一部电影的评分为1和5的两条评论一样,我都得到了,但没有一条评论为3。请帮忙!

在models.py中:

class Film(models.Model):
    title = models.CharField(max_length=100)
    title_short = models.CharField(max_length=17, default=None, null=True)
    plot = models.TextField()
    poster = models.ImageField(default="default.png", upload_to="posters")
    release_date = models.DateField(blank=True, null=True)
    date_posted = models.DateTimeField(default=timezone.now)


class Review(models.Model):
    writer = models.ForeignKey(User, on_delete=models.CASCADE)
    reviewed_film = models.ForeignKey(Film, on_delete=models.CASCADE)

    title = models.CharField(max_length=100)
    content = models.TextField()
    rating = models.IntegerField(
        default=1, validators=[MinValueValidator(1), MaxValueValidator(5)]
    )

在views.py中:

class ToplistListView(LoginRequiredMixin, ListView):
    model = Review
    template_name = "board/toplist.html"
    context_object_name = "films"

    def get_queryset(self):
        return Review.objects.annotate(avg_rating=Avg('rating')).order_by('-avg_rating')

1 个答案:

答案 0 :(得分:3)

您将获得每个评论的平均评分,这当然会为您提供该评论的评分,因为每个评论只有一个评分。一个数字的平均值就是那个数字。

我认为您想要的是一部电影的所有收视率的平均值。因此,您需要一个类似于以下内容的查询:

Flim.objects.annotate(avg_rating=Avg('review_set__rating')).order_by('-avg_rating')

此外,您可以通过设置review_set或将related_name='reviews'的名称(如果未设置任何相关名称,将其默认设置为外键查找的默认名称)更改为所需的名称。调用了FK定义。

所以:

reviewed_film = models.ForeignKey(Film, related_name='reviews', on_delete=models.CASCADE)

ETA:如果进行更改,则查询将变为:

Flim.objects.annotate(avg_rating=Avg('reviews__rating')).order_by('-avg_rating')