按计算字段计算字段和顺序

时间:2016-03-06 18:55:43

标签: django orm django-1.9

我有以下型号:

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 个答案:

答案 0 :(得分:1)

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

但你有两种选择:

  1. 创建一个字段来存储计算的值并覆盖write方法,以便您可以计算那里的值
  2. 按照此answer
  3. 中的说明对查询集进行排序

答案 1 :(得分:1)

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

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