Запрос для получения MOV ie с самым высоким рейтингом при минимуме 5 человек. - PullRequest
0 голосов
/ 14 января 2020

Я хочу получить имя mov ie с максимальным рейтингом mov ie при минимальном количестве 5 человек с рейтингом django. Мой код:

model.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()

Какой будет запрос, чтобы получить mov ie с самым высоким рейтингом при минимуме 5 человек?

Ответы [ 2 ]

2 голосов
/ 14 января 2020

Я предлагаю вам внести некоторые изменения в вашу модель. Обычно ForeignKey s делают , а не оканчиваются суффиксом 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()

Затем мы можем получить самое высокое с рейтингом mov ie с:

from django.db.models import Avg, Count

higest_rated = Movie.objects.annotate(
    rating=Avg('rating__rating'),
    votes=Count('rating')
).filter(<b>votes__gte=5</b>).order_by('-rating').first()

Здесь votes__gte=5 будет фильтроваться таким образом, что получит Movie s только с пятью или более голосами, и мы упорядочим по rating в порядке убывания.

0 голосов
/ 14 января 2020

Я бы изменил модель, убрав поля, связанные с объектами рейтинга, из Списка наблюдения и Перемещения ie.

Добавьте класс «Оценить», а затем отфильтруйте по двум условиям:

  1. Количество (ставка для точного Mov ie)> минимальный порог (например, 5)
  2. AVG (рейтинг для точного Mov ie)> минимальный порог (например, 5) или, если вы нужны фильмы с самым высоким рейтингом, используйте Order by, как описано в этом ответе

В вашем случае вы могли бы использовать Count и Average с Watchlist.Rating field

...