Рассчитать поле и порядок по рассчитанному полю
У меня есть следующие модели:
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 применяется на уровне базы данных.
Но у вас есть две альтернативы:
- Создайте поле для хранения вычисленного значения и переопределите метод записи, чтобы вы могли вычислить значение там
- Сортируйте набор запросов, как показано в этом ответе
Вы можете аннотировать данные, которые вы хотите отсортировать, а затем сортировать по этому значению.
Question.objects.annotate(vote_count=Sum('vote_set__vote')).order_by('vote_count')