按聚合字段值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中的新聚合支持及其annotate
function。
所以查询可能看起来像这样:
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。