当前位置:  开发笔记 > 编程语言 > 正文

按字段值的QuerySet

如何解决《按字段值的QuerySet》经验,为你挑选了2个好方法。

假设我有以下型号:

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'没有可用于查询的数据库字段.



1> Alex Koshele..:

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

所以查询可能如下所示:

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



2> S.Lott..:

您可以非常简单地在Python中编写自己的排序.

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

这很好用,因为我们对列表进行了排序,我们将提供给模板.


@okoman ...这意味着您没有使用list()函数转换为列表
推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有