0

制作查询集时,我似乎不能同时使用注释和额外内容

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 一样)。所以我需要先计算这些。

有任何想法吗?

4

1 回答 1

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将是一个 dict: {'total': }

于 2010-06-02T16:32:53.860 回答