2012-05-23 38 views
3

我想註解一個對象列表(每個對象都有一組tags和一個整數值points),以便它們可以按照標記加上點的總數進行排序。如何通過總共兩個字段對django queryset進行排序?

但是,我找不到任何方式來註釋與兩列的總和對象。任何想法,我應該如何做到這一點?

這些是我正在使用的模型,leaderboard()函數是我難以工作的函數。

class Game (models.Model): 
    users = models.ManyToManyField(User, through='Player', related_name='games') 

    def leaderboard (self): 
     """ Return a list of players ranked by score, where score is the total of the count of the players tags and their points. """ 
     leaderboard = self.player_set.annotate(
      tagcount=models.Count('tags') 
     ).extra(
      select={'score': 'tagcount + points'}, 
      order_by=('score',) 
     ) 
     return leaderboard 

class Player (models.Model): 
    game = models.ForeignKey(Game) 
    user = models.ForeignKey(User) 
    points = models.SmallIntegerField(default=0, help_text="Points that have been awarded to the player") 

class Tag (models.Model): 
    game = models.ForeignKey(Game, related_name='tags') 
    player = ForeignKey(Player, related_name='tags') 

編輯2:使用額外的

好了,所以我得到了額外的工作,通過手動計數的標籤數量,並稱該點解決方案。

def leaderboard (self): 
    """ Return a list of players ranked by score, where score is the total of the count of the players tags and their points. """ 
    return self.players.extra(
     select={'score': '(select count(*) from kaos_tag where kaos_tag.tagger_id=kaos_player.id) + points'}, 
     order_by=('-score',) 
    ) 
+0

[字段的Django ORDER_BYΣ(可能重複http://stackoverflow.com/questions/3160798/django-order-by-sum-of場) – DrTyrsa

+0

@DTTyrsa我試圖做同樣的事情,但與其中一個字段是一個計數,而不是一個實際的領域。 – borntyping

+0

我會去denolmazition:添加'tags_count'提交給模型,並用信號更新它。或者使用[原始查詢](https://docs.djangoproject.com/zh/dev/topics/db/sql/)作爲替代方案。 – DrTyrsa

回答

1

使用額外

players.objects.extra(
    select={'fieldsum':'tags__count + points'}, 
    order_by=('fieldsum',) 
) 
+0

好複製本。 – DrTyrsa

+0

只是爲了幫助;)@DrTyrsa – Efazati

+0

@Efazati這不起作用 - 數據庫不會和django做同樣的翻譯,因此會拋出這樣的錯誤: 'Caught DatabaseError while rendering:no such column:tags__count' – borntyping

相關問題