Django:如何根据它的评级获得入场位置

时间:2013-07-12 09:37:53

标签: python django rating

class Blog(models.Model):
    name = models.CharField(max_length=200)
    rating = models.IntegerField()
    country = models.CharField(max_length=50)

有两个TOP:

  • 按世界排名
  • 按国家/地区评分

我需要在每个评级中提供位置。 F.e。

db中的博客:

  • Blog(name ='Python',rating = 100,country ='Russia')
  • Blog(name ='Django',rating = 10,country ='Russia')
  • 博客(name ='Programming',rating = 5,country ='France')
  • Blog(name ='Stackoverflow',rating = 9,country ='Latvia')

世界排名最高:

  1. Blog(name ='Python',rating = 100,country ='Russia')
  2. Blog(name ='Django',rating = 10,country ='Russia')
  3. Blog(name ='Stackoverflow',rating = 9,country ='Latvia')
  4. 博客(name ='Programming',rating = 5,country ='France')
  5. 按国家/地区评分最高的俄罗斯:

    1. Blog(name ='Python',rating = 100,country ='Russia')
    2. Blog(name ='Django',rating = 10,country ='Russia')
    3. 如何根据评分获得博客的位置?

      更新

      我应该能够这样想:

      Blog.objects.get(pk=1).world_position # output = 23
      Blog.objects.get(pk=1).country_position # output = 14
      

      因为使用order_by('rating')的简单迭代不适合。

1 个答案:

答案 0 :(得分:1)

应该像这个一样简单

for i, blog in enumerate(Blog.objects.all().order_by('-rating')):
    i, blog 
Blog.objects.filter(country='Russia').order_by('-rating')

如果您有非常大的数据集

,您可以查看Raw Sql以获取行号

更新:虽然这对大型数据集效率不高,你应该考虑使用RAW SQL来获取rownumber,或者你可以找到一种方法来存储基于博客对象评级的排名。

class Blog(models.Model):
    name = models.CharField(max_length=200)
    rating = models.IntegerField()
    country = models.CharField(max_length=50)

    @property
    def world_position(self):
        ids = list(Blog.objects.all().order_by('-rating').values_list('id', flat=True))
        return ids.index(self.id)