gpt4 book ai didi

python - Django 的平均收视率

转载 作者:行者123 更新时间:2023-12-05 02:08:46 24 4
gpt4 key购买 nike

我在学校使用 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')

最佳答案

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

我认为您想要的是电影所有评分的平均值。所以你想要一个看起来像这样的查询:

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

此外,您可以通过设置 related_name='reviews' 或您希望在 FK 定义上调用它的任何内容。

所以:

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

预计到达时间:如果您进行更改,您的查询将变为:

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

关于python - Django 的平均收视率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60602349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com