按聚合字段值sorting查询集

假设我有以下模型:

class Contest: title = models.CharField( max_length = 200 ) description = models.TextField() class Image: title = models.CharField( max_length = 200 ) description = models.TextField() contest = models.ForeignKey( Contest ) user = models.ForeignKey( User ) def score( self ): return self.vote_set.all().aggregate( models.Sum( 'value' ) )[ 'value__sum' ] class Vote: value = models.SmallIntegerField() user = models.ForeignKey( User ) image = models.ForeignKey( Image ) 

网站的用户可以将他们的图像分配给几个比赛。 然后其他用户可以投它们上或下。 一切工作正常,但现在我想显示一个页面上,用户可以看到所有的贡献某个比赛。 图像应按照他们的分数sorting。 所以我试了下:

 Contest.objects.get( pk = id ).image_set.order_by( 'score' ) 

由于我担心这是行不通的,因为“分数”是没有可用于查询的数据库字段。

哦,当然,我忘记了Django中的新聚合支持及其annotatefunction。

所以查询可能看起来像这样:

 Contest.objects.get(pk=id).image_set.annotate(score=Sum('vote__value')).order_by( 'score' ) 

你可以很简单地用Python编写自己的类。

 def getScore( anObject ): return anObject.score() objects= list(Contest.objects.get( pk = id ).image_set) objects.sort( key=getScore ) 

这很好地工作,因为我们将列表,我们要提供给模板。

db级别的order_by不能按模型的python方法对queryset进行sorting。

解决方法是将score字段引入Image模型,并在每个Vote更新中重新计算它。 某种反规范化。 你什么时候可以按它来sorting。