title: Proper way to annotate a rank field for a queryset
body: <p>Assume models like this:</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>I want to have a queryset function to return total score of each person which is addition of all his games score and all times he has spent in all his sessions alongside with a rank that a person has relative to all persons. Something like below:</p>
  
  <pre><code>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'))
  </code></pre>
  
  <p>I could find a way to calculate total score, but dense rank is not what I want, because it just calculates rank based on persons in current queryset but I want to calculate rank of a person relative to all persons.</p>
  
  <p>I use django 1.11 and postgres 10.5, please suggest me a proper way to find rank of each person in a queryset because I want to able to add another filter before or after calculating total_score and rank.</p>