Предположим, что модели такие:
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и звание.