В моей базе данных есть 2 модели: Movie
и Comment
(внешний ключ указывает на Movie
).
from django.db import models
class Movie(models.Model):
title = models.CharField(max_length=120, blank=False, unique=True)
class Comment(models.Model):
movie = models.ForeignKey(movie_models.Movie, null=False, on_delete=models.CASCADE)
body = models.TextField(blank=True)
Что я пытаюсь сделать, это создать рейтинг Movies
, где позиция определяется числом связанных Comments
.
. Я могу комментировать количество комментариев иправильно упорядочить результат:
from django.db.models import Count
qs = Movie.objects.annotate(total_comments=Count('comment')).order_by('-total_comments')
Это дает мне набор запросов в правильном порядке, но я хотел бы сделать еще одну вещь - аннотировать 'rank' для каждой строки.
Так что мой вопрос: как я могу пометить «ранг» для каждой строки результата?Обратите внимание, что для фильмов с одинаковым количеством комментариев требуется одинаковый ранг.
| movie_title | total_comments | rank |
|--------------|----------------|------|
| mov1 | 10 | 1 |
| mov2 | 5 | 2 |
| mov3 | 5 | 2 |
| mov4 | 3 | 3 |
Я пытался использовать оконные функции , так как некоторые примеры показались мне законными:
from django.db.models import F, Window
dense_rank = Window(
expression=DenseRank(),
order_by=F('total_comments').desc()
)
qs = Movie.objects.annotate(total_comments=Count('comment')).annotate(rank=dense_rank)
Но выполнение этого запроса повышает django.db.utils.OperationalError: near "(": syntax error