在django中同时使用.annotate()和extra()

在django中同时使用.annotate()和extra(),django,annotate,extra,Django,Annotate,Extra,在创建查询集时,我似乎不能同时使用annotate和extra 这个 返回 Caught Warning while rendering: Truncated incorrect DOUBLE value: 'userUpVotes' 我想将UserUpVoces和UserDownVoces相加,得到一个“投票”字段,然后按此字段排序 UserUpVoces是一个相关的多用户域(UserDownVoces也是)。所以我需要先数一数 有什么想法吗?如果您将投票存储在同一个表或列中,则这类事情会简

在创建查询集时,我似乎不能同时使用annotate和extra 这个

返回

Caught Warning while rendering: Truncated incorrect DOUBLE value: 'userUpVotes'
我想将UserUpVoces和UserDownVoces相加,得到一个“投票”字段,然后按此字段排序

UserUpVoces是一个相关的多用户域(UserDownVoces也是)。所以我需要先数一数


有什么想法吗?

如果您将投票存储在同一个表或列中,则这类事情会简单得多,向上投票的值为+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':}

如果您将投票存储在同一个表或列中,则这类事情会容易得多,向上投票的值为+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':}

如果去掉单个倒逗号,是否有效-例如
'vows':“userupvoces-userdownvoces”
?更新了我的问题,并对其进行了修改。删除倒逗号没有什么区别,但是我有一个新的错误,它是从我的新查询中引发的。这就是“(1054,“字段列表”中的未知列‘向上投票’”)如果去掉单个倒逗号是否有效-例如
‘投票’:“userupvoces-userdownvoces”
?更新了我的问题,并对其进行了修改。删除倒逗号没有什么区别,但是我有一个新的错误,它是从我的新查询中引发的。这是“(1054,“字段列表”中的未知列“向上投票”)