2013-07-12 26 views
1
class Blog(models.Model): 
    name = models.CharField(max_length=200) 
    rating = models.IntegerField() 
    country = models.CharField(max_length=50) 

有兩件上衣讓輸入位置:Django的:如何根據它的評級

  • 按排名世界
  • 被評級國家

我需要提供位置在每個評級。 F.e.

博客在DB:

  • 博客(名稱='Python的,等級= 100,全國= '俄羅斯')
  • 博客(名稱='Django的,等級= 10,國家=」俄羅斯)
  • 博客(名稱='程序」,評分= 5,國家= '法國')
  • 博客(名稱= '#1',評級= 9,國家='拉脫維亞)

按世界排行榜排列:

  1. 博客(名稱='Python的,等級= 100,全國= '俄羅斯')
  2. 博客(名稱='Django的,等級= 10,國家= '俄羅斯')
  3. 博客(名稱= '#1',評級= 9,國家='拉脫維亞)
  4. 博客(名稱= '程序',評分= 5,國家= '法國')

最高評級的國家俄羅斯:

  1. 博客(名稱='Python的,等級= 100,全國= '俄羅斯')
  2. 博客(名稱='Django的,等級= 10,國家= '俄羅斯')

我怎樣才能得到博客的立場基於評級?

UPDATE:

我應該能夠做到somethink這樣的:

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

因爲這簡單的迭代與ORDER_BY( '評級')不適合的。

+0

以全球排名按評級,按國家篩選按國家排序並按等級排序。 –

+0

@IonutHulub看**更新** – dimazubrik

回答

1

應該像這樣簡單

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

你可以看一下原始的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) 
+0

我需要** POSITION **(1,2,3,4,...,512),而不僅僅是order_by等級。 – dimazubrik

+0

Django查詢集很懶。我認爲獲得職位的最佳方式是簡單迭代。 – user710907

+0

迭代要麼不適合。因爲我應該能夠這樣做sthm: Blog.objects.get(pk = 23).world_position – dimazubrik