我从Django开始,我希望获得评分得分更高的电影,而且我不知道如何找到使用模型状态的方法。现在有我的课程:
class Movie(models.Model):
movieId = models.IntegerField(unique=True)
title = models.TextField(max_length=100)
anno = models.IntegerField()
imdbId = models.IntegerField(unique=True)
tmdbId = models.IntegerField(unique=True)
def __str__(self):
return self.title
class Rating(models.Model):
rating = models.IntegerField()
timestamp = models.IntegerField()
user = models.ForeignKey(User, on_delete = models.CASCADE)
movie = models.ForeignKey(Movie, on_delete = models.CASCADE)
def __str__(self):
return str(self.user)+"--"+str(self.rating)
答案 0 :(得分:0)
对于给定的电影some_movie
,您可以通过以下方式获取与相关的 Rating
的集合:
some_movie.rating_set.all()
如果要为每部电影计算平均等级,则可以.annotate(..)
Movie
查询集,例如:
from django.db.models import Avg
Movie.objects.annotate(
avg_rating=Avg('rating__rating')
)
在这种情况下, that 查询集中的Movie
将具有属性.avg_rating
,其中包含评分的平均值(如果存在,则为None
没有评分。
我们也可以将此注释用于过滤目的,例如,以下内容将为我们提供平均评分大于或等于3
的所有电影:
# movies with an average rating larger than or equal to 3
from django.db.models import Avg
Movie.objects.annotate(
avg_rating=Avg('rating__rating')
).filter(
avg_rating___gte=3
)
我们还可以使用此命令来订购电影,例如将Movie
从大的平均评分到小的平均评分:
# order movies best to worse (by average rating)
from django.db.models import Avg
Movie.objects.annotate(
avg_rating=Avg('rating__rating')
).order_by('-avg_rating')