2010-06-01 17 views
0

Il semble que je ne peux pas utiliser annoter et extra ensemble lors d'un queryset CetteEn utilisant .annotate() et extra() ensemble dans django

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') 

retours

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

Je veux ajouter à la fois userUpVotes et userDownVotes ensemble pour obtenir un champ "votes", puis passer commande par ce champ. UserUpVotes est un ManyToManyField d'utilisateurs connexe (comme userDownVotes). Donc j'ai besoin de compter ces premiers.

Des idées?

+0

-t-il si vous le prenez les guillemets simples sur - par exemple, ' 'votes': "userUpVotes - userDownVotes"'? –

+0

Mis à jour ma question, également fait un amendement à celui-ci. Supprimer les virgules inversées n'a pas fait de différence, Cependant, j'ai une nouvelle erreur qui est levée à partir de ma nouvelle requête. Lequel est "(1054," Colonne inconnue 'up_votes' dans 'liste des champs' ")" – dotty

Répondre

3

Ce genre de chose est beaucoup plus facile si vous stockez les votes dans le même tableau ou la même colonne, avec une valeur de +1 pour un vote positif et -1 pour un vote négatif. Vous pouvez toujours facilement compter le nombre de votes ascendants ou descendus avec un filtre simple, calculer le nombre total de votes avec un simple compte, et calculer le score total avec l'agrégat de somme.

Exemple de code pour stocker les votes dans une table séparée.

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 sera un dict: { 'total':}