计算字段并按计算字段排序
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 是在数据库级别应用的。
但是你有两个选择:
- 创建一个字段来存储计算值并重写写入方法,以便您可以在那里计算值
- 按此 answer
所示对查询集进行排序
您可以注释要排序的数据,然后按该值排序。
Question.objects.annotate(vote_count=Sum('vote_set__vote')).order_by('vote_count')
我有以下型号:
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 是在数据库级别应用的。
但是你有两个选择:
- 创建一个字段来存储计算值并重写写入方法,以便您可以在那里计算值
- 按此 answer 所示对查询集进行排序
您可以注释要排序的数据,然后按该值排序。
Question.objects.annotate(vote_count=Sum('vote_set__vote')).order_by('vote_count')