我在数据库中有两个模型:
这给了我正确排序的查询集,但我想做更多的事情 - 为每一行注释“rank”。
那么我的问题是:如何将“rank”注释到结果的每一行?请注意,需要对具有相同评论数量的电影具有相同的排名。
电影
和评论
(它具有指向电影
的外键)。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)
我的目标是创建一个基于相关评论数确定排名的电影排行榜。
我可以注释评论数并正确排序结果:
from django.db.models import Count
qs = Movie.objects.annotate(
total_comments=Count('comment')
).order_by('-total_comments')
这给了我正确排序的查询集,但我想做更多的事情 - 为每一行注释“rank”。
那么我的问题是:如何将“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
错误