计算字段并按计算字段排序

Calculate field and order by the calculated field

我有以下型号:

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.

实现了

无法做到这一点,因为 order_by 是在数据库级别应用的。

但是你有两个选择:

  1. 创建一个字段来存储计算值并重写写入方法,以便您可以在那里计算值
  2. 按此 answer
  3. 所示对查询集进行排序

您可以注释要排序的数据,然后按该值排序。

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