一尘不染

QuerySet by聚合字段值

django

假设我有以下模型:

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'没有可在查询中使用的数据库字段。


阅读 338

收藏
2020-03-27

共1个答案

一尘不染

哦,当然,我忘了Django中新的聚合支持及其annotate功能。

因此查询可能如下所示:

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