假设我有以下型号:
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 )
网站的用户可以将他们的图片贡献给多个竞赛。然后其他用户可以向上或向下投票。
一切正常,但现在我想显示一个页面,用户可以在该页面上看到对某个比赛的所有贡献。图像应按其分数排序。 因此我尝试了以下内容:
Contest.objects.get( pk = id ).image_set.order_by( 'score' )
因为我担心它不起作用,因为'score'
没有可用于查询的数据库字段。
答案 0 :(得分:47)
哦,当然我忘记了Django中的新聚合支持及其annotate
功能。
因此查询可能如下所示:
Contest.objects.get(pk=id).image_set.annotate(score=Sum('vote__value')).order_by( 'score' )
答案 1 :(得分:9)
您可以非常简单地在Python中编写自己的排序。
def getScore( anObject ):
return anObject.score()
objects= list(Contest.objects.get( pk = id ).image_set)
objects.sort( key=getScore )
这很好用,因为我们对列表进行了排序,我们将提供给模板。
答案 2 :(得分:2)
db-level order_by
无法按模型的python方法对查询集进行排序。
解决方案是将score
字段引入Image
模型,并在每次Vote
更新时重新计算。某种非规范化。什么时候可以按它排序。