假设我有以下模型:
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'没有可在查询中使用的数据库字段。
'score'
哦,当然,我忘了Django中新的聚合支持及其annotate功能。
annotate
因此查询可能如下所示:
Contest.objects.get(pk=id).image_set.annotate(score=Sum('vote__value')).order_by( 'score' )