Django 计算字段和按计算字段排序

Django 计算字段和按计算字段排序,django,orm,django-1.9,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.Mo

我有以下型号:

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()
问题
模型可以看出,我使用自定义方法计算每个问题的投票数。我这样做是因为我想将投票与实际问题分开,因此我不想在
问题
模型以及
投票
中保留投票计数器,因为这将很难在以后维护

根据良好的设计,可以计算的信息不应该存储

我现在可以找到每个问题的投票结果,但问题归结为顺序。我想得到所有的问题,并按他们的投票顺序排列。据我所知,这是不可能的,因为
order\u by()
是数据库级别的,而我的方法不是数据库级别的

我想找到一种很好的方法来实现这一点,而不使用除
ORM
之外的其他技术。这可能吗

编辑:

似乎没有很好的方法使用ORM,所以我使用排序的
sorted

实现了order\u by,因为order\u by是在数据库级别应用的

但你有两个选择:

  • 创建一个字段来存储计算值,并重写write方法,以便可以在其中计算值
  • 对查询集进行排序,如下图所示

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

    但你有两个选择:

  • 创建一个字段来存储计算值,并重写write方法,以便可以在其中计算值
  • 对查询集进行排序,如下图所示

  • 可以对要排序的数据进行注释,然后按该值排序


    Question.objects.annotate(投票计数=Sum('vote\u set\u vote')).order\u by('vote\u count')
    您可以对要排序的数据进行注释,然后按该值排序


    Question.objects.annotation(vote\u count=Sum('vote\u set\u vote'))。order\u by('vote\u count')

    谢谢您的回答。我想用
    视图
    表来代替将数据存储在
    问题
    模型中,但我不确定Django是否可以。谢谢您的回答。我想用一个
    视图
    表来代替将数据存储在
    问题
    模型中,但我不确定Django是否可行。我想注释应该做你想做的事情,请参见以下答案:谢谢你的评论@ger.s.brett。在提出问题之前,我已经面对过这个解决方案,但我发现这个解决方案的唯一困难是两个模型之间应该有一个
    连接
    ,这样我就可以实现这一点。我想annotate应该做你想做的事,请参见以下答案:谢谢你的评论@ger.s.brett。在提出问题之前,我已经面对过这个解决方案,但我发现这个解决方案的唯一困难是,两个模型之间应该有一个
    连接
    ,这样我才能实现这一点。