【问题标题】:Query to fetch highest rated movie with mimimum 5 people rated查询以获取评分最高且至少有 5 人评分的电影
【发布时间】:2020-04-30 21:16:25
【问题描述】:
我想获取在 django 中评分最高且至少有 5 人评分的电影的名称。
我的代码:
模型.py
class Movie(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=100)
vote_count = models.IntegerField()
class Watchlist(models.Model):
userid = models.IntegerField()
movie_id = models.ForeignKey(Movie, on_delete=models.CASCADE)
rating = models.IntegerField()
要查询最少 5 人的评分最高的电影吗?
【问题讨论】:
标签:
python
django
django-models
django-rest-framework
django-views
【解决方案1】:
我建议您对模型进行一些更改。通常ForeignKeys not 以id 后缀结尾,因为 Django 将添加一个带有 _id 后缀的“双字段”来存储目标字段的值。此外,您最好为用户模型创建一个ForeignKey。如果您自己不指定主键,Django 会自动添加一个名为id 的字段,即AutoField,因此无需手动添加。最后,您不需要将vote_count 存储在Movie 的字段中,您可以通过计算相关Rating 对象的数量来检索它:
from django.conf import settings
class Movie(models.Model):
title = models.CharField(max_length=100)
class Rating(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete.models.CASCADE)
movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
rating = models.IntegerField()
然后我们可以检索评分最高的电影:
from django.db.models import Avg, Count
higest_rated = Movie.objects.annotate(
rating=Avg('rating__rating'),
votes=Count('rating')
).filter(votes__gte=5).order_by('-rating').first()
这里votes__gte=5将过滤,使其仅获得五票或更多票的Movies,我们按rating降序排列。
【解决方案2】:
我会修改模型,从 Watchlist 和 Movie 中移出 Rating 实体相关字段。
添加“Rate”类,然后按两个条件过滤:
- 计数(准确电影的速率)> 最小阈值(例如 5)
- AVG(准确电影的评分)> 最小阈值(例如 5)
或者,如果您需要收视率最高的电影,请按照 in that answer 的描述使用 Order by
在您的情况下,您可以将 Count 和 Average 与 Watchlist.Rating 字段一起使用