Можно ли заказать order_by с вызываемым?

ДУБЛИРОВАНИЕ: Использование пользовательской модели Django свойство метода в order_by()

У меня есть две модели; один, в котором хранятся сообщения, и другой, в котором хранятся голоса, сделанные по этим сообщениям, связанные с использованием поля ForeignKey. Каждое голосование хранится как отдельная запись, так как мне нужно отслеживать пользователя и дату и время, когда было подано голосование.

Я создал вспомогательную функцию, которая подсчитывает все голоса, используя функцию суммирования Django 1.1.

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...

Один запрос, который мне нужно сделать, должен выполнить один из order_by подсчета. Тем не мение:

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

выдает следующую ошибку шаблона:

Обнаружено исключение при рендеринге: невозможно преобразовать ключевое слово «tally» в поле. Возможные варианты: date_created, описание, идентификатор, is_active, имя, связанный, слаг, пользователь, голосование.

Есть ли способ заставить функцию order_by() принимать вызываемый объект?


person Soviut    schedule 21.11.2009    source источник


Ответы (1)


Оказывается, метод Annotate был решением:

Post.objects.all().annotate(vote_tally=Sum('vote__value')).order_by('-vote_tally')
person Soviut    schedule 21.11.2009
comment
кстати, использование .all() избыточно - person SmileyChris; 23.11.2009