Рассчитать поле и порядок по рассчитанному полю

У меня есть следующие модели:

class Question(models.Model):
    Title = models.CharField(max_length=250)
    User = models.ForeignKey(User)

    def GetVotes(self):
        return Vote.objects.filter(Question=self).aggregate(Sum('Vote'))['Vote__sum']

class Vote(models.Model):
    Question = models.ForeignKey(Question)
    User = models.ForeignKey(User)
    Vote = models.IntegerField()

И как видно из Question Модель Я использую нестандартный метод для подсчета голосов по каждому вопросу. Я делаю это так, как я хотел бы отделить голоса от реального вопроса, и, следовательно, я не хотел бы сохранять счетчик голосов в Question модель, а также в Vote как это будет трудно поддерживать позже.

В соответствии с хорошим дизайном, информация, которую можно рассчитать, не должна храниться.

Теперь я могу найти голоса по каждому вопросу просто отлично, но проблема сводится к order_by, Я хотел бы получить все вопросы и заказать их по голосам. Насколько я знаю, это невозможно, так как order_by() до уровня базы данных, где мой метод не на уровне базы данных.

Я хотел бы найти хороший способ сделать это без использования другой техники, чем ORM это возможно?

Редактировать:
Похоже, что нет хорошего способа использования ORM, поэтому я реализовал с помощью sorted,

2 ответа

Решение

Нет способа сделать это, так как order_by применяется на уровне базы данных.

Но у вас есть две альтернативы:

  1. Создайте поле для хранения вычисленного значения и переопределите метод записи, чтобы вы могли вычислить значение там
  2. Сортируйте набор запросов, как показано в этом ответе

Вы можете аннотировать данные, которые вы хотите отсортировать, а затем сортировать по этому значению.

Question.objects.annotate(vote_count=Sum('vote_set__vote')).order_by('vote_count')

Другие вопросы по тегам