在django中一起使用.annotate()和extra()

时间:2010-06-01 17:43:06

标签: django annotate extra

在制作查询集时,我似乎无法使用注释和额外功能 此

discussions = game.gamediscussion_set.filter(reply_to=None).annotate(up_votes = Count('userUpVotes'), down_votes=Count('userDownVotes')).extra(select={'votes':"'userUpVotes' - 'userDownVotes'"}).order_by('votes')

返回

Caught Warning while rendering: Truncated incorrect DOUBLE value: 'userUpVotes'

我想将userUpVotes和userDownVotes一起添加到“投票”字段,然后按此字段排序。

userUpVotes是一个相关的ManyToManyField用户(与userDownVotes一样)。所以我需要先计算这些。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

如果您在同一个表或列中存储投票,这种事情会容易得多,向上投票的值为+1,向下投票的值为-1。您仍然可以使用简单的过滤器轻松计算向上或向下投票的数量,使用简单计数计算总投票数,并使用总和计算总得分。

用于在单独的表格中存储投票的示例代码。

CHOICES = {
    1: 'UP',
    -1: 'DOWN'
}

class Vote(models.Model):
    user = models.ForiegnKey(User) # prevent ballot stuffing
    game = models.ForiegnKey(Game)
    vote = models.IntegerField(choices=CHOICES)

total_up_votes = Vote.objects.filter(game=GAME_INSTANCE).filter(vote=1).count()
total_votes = Vote.objects.filter(game=GAME_INSTANCE).count()
total_score = Vote.objects.filter(game=GAME_INSTANCE).aggregate(total=Sum('vote'))

total_score将是一个词典:{'total':}