2009-11-21 9 views
3

DUPLICATE:Using a Django custom model method property in order_by()Est-il possible de commander_by avec un appelable?

J'ai deux modèles; un qui stocke les messages et un autre qui stocke les votes effectués sur ces messages, liés à l'aide d'un champ ForeignKey. Chaque vote est stocké en tant qu'enregistrement séparé, car j'ai besoin de suivre l'utilisateur et la date et l'heure auxquelles le vote a été effectué.

J'ai créé une fonction d'aide qui calcule tous les votes en utilisant la fonction d'agrégation de Django 1.1 Sum.

class Post(models.Model): 
    ...some fields... 

    def tally(self): 
     return self.vote_set.all().aggregate(Sum('value'))['value__sum'] or 0 

class Vote(models.Model): 
    post = models.ForeignKey(Post) 
    value = models.IntegerField() 
    ...some fields... 

Une question je dois faire doit faire un hors order_by du décompte. Cependant:

Post.objects.all().order_by('tally') 

cède l'erreur de modèle suivant:

Caught an exception while rendering: Cannot resolve keyword 'tally' into field. Choices are: date_created, description, id, is_active, name, related, slug, user, vote

Il y un moyen d'obtenir la fonction order_by() prendre un appelable?

Répondre

5

Il se trouve la méthode Annoter est la solution:

Post.objects.all().annotate(vote_tally=Sum('vote__value')).order_by('-vote_tally') 
+2

BTW, en utilisant '.tout()' est redondant – SmileyChris