タグとポイントの合計数でソートできるように、オブジェクトのリスト (それぞれが と のセットをtags
持つ整数値)に注釈を付けたいと考えています。points
ただし、2 つの列の合計でオブジェクトに注釈を付ける方法が見つかりません。これをどのように行うべきかについて何か考えはありますか?
これらは私が使用しているモデルであり、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',)
)