如何用前键查找?

时间:2018-12-08 10:09:19

标签: django foreign-keys

我从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)

1 个答案:

答案 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')