Использование .annotate () и extra () вместе в Django - PullRequest
0 голосов
/ 01 июня 2010

Кажется, я не могу использовать аннотации и дополнительные вместе при создании набора запросов Это

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 Ответ

3 голосов
/ 02 июня 2010

Такого рода вещи намного проще, если вы сохраняете голоса в одной и той же таблице или столбце со значением +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':}

...