0

我一直在尝试找到对 get 查询集进行评分的平均值。

这是我的models.py

class Movie(models.Model):
    title = models.CharField(max_length=240)
    release = models.DateField(blank=True)
    review = models.TextField()
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    poster = models.FileField(null=True, blank=True)
    poster_wide = models.FileField(null=True, blank=True)
    created = models.DateTimeField(auto_now_add=True)


    def comment_count(self):
       return self.comment_set.count()

    def rating_avg(self):
       rate = self.rating.aggregate(Avg('rating'))
       return rate['rating__avg']

class Rating(models.Model):
    movie = models.ForeignKey(Movie,on_delete=models.CASCADE,related_name='rating')
    rating = models.IntegerField(choices=rating_choices, default=5)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)

view.py中的代码

def home(request):
    top_movies = Movie.objects.annotate(avg = Avg('rating')).order_by('avg')[:5]
    context = {
              'top_movies': top_movies,
         }
    return render(request, 'home.html', context)

我需要从这个给定的模型中找到评分最高的 5 部电影。但不知道如何分组查询可以找到平均值。上述查询未提供正确答案。我可以参考的其他答案或文档的任何链接?

4

2 回答 2

2

几乎什么都试了,终于找到了。这给出了带有电影对象的所需查询集

top_movies = Movie.objects.annotate(avg=Avg("rating__rating")).order_by('-avg')[:5]
于 2018-08-14T05:56:43.657 回答
0

在这里完全和完全吐口水,因为我无法真正测试这一点,但也许你可以通过评级到达电影,因为它是包含另一个的 ForeignKey 的模型。

Rating.objects.values('movie').annotate(avg=Avg('rating')).order_by('avg')

or

Rating.objects.annotate(avg=Avg('rating'), 
                        movie=Rating.objects.values('movie')).order_by('avg')
于 2018-08-13T18:20:26.937 回答