【发布时间】:2019-03-15 02:21:59
【问题描述】:
假设模型如下:
class Person(models.Model):
name = models.CharField(max_length=20)
class Session(models.Model):
start_time = models.TimeField(auto_now_add=True)
end_time = models.TimeField(blank=True, null=True)
person = models.ForeignKey(Person)
class GameSession(models.Model):
game_type = models.CharField(max_length=2)
score = models.PositiveIntegerField(default=0, blank=True)
session = models.ForeignKey(Session)
我想要一个查询集函数来返回每个人的总得分,这是他所有游戏得分和他在所有会话中花费的所有时间以及一个人相对于所有人的排名。如下所示:
class DenseRank(Func):
function = 'DENSE_RANK'
template = '%(function)s() Over(Order by %(expressions)s desc)'
class PersonQuerySet(models.query.QuerySet):
def total_scores(self):
return self.annotate(total_score=some_fcn_for_calculate).annotate(rank=DenseRank('total_score'))
我可以找到一种计算总分的方法,但密集排名不是我想要的,因为它只是根据当前查询集中的人计算排名,但我想计算一个人相对于所有人的排名。
我使用 django 1.11 和 postgres 10.5,请建议我找到查询集中每个人的排名的正确方法,因为我希望能够在计算 total_score 和排名之前或之后添加另一个过滤器。
【问题讨论】:
标签: django postgresql django-queryset