【问题标题】: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 notid 后缀结尾,因为 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”类,然后按两个条件过滤:

      1. 计数(准确电影的速率)> 最小阈值(例如 5)
      2. AVG(准确电影的评分)> 最小阈值(例如 5) 或者,如果您需要收视率最高的电影,请按照 in that answer 的描述使用 Order by

      在您的情况下,您可以将 CountAverage 与 Watchlist.Rating 字段一起使用

      【讨论】:

      • 谁能帮忙查询一下?
      猜你喜欢
      • 2020-04-30
      • 2014-11-24
      • 1970-01-01
      • 2016-04-07
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多