首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >A QuerySet by aggregate字段值

A QuerySet by aggregate字段值
EN

Stack Overflow用户
提问于 2009-01-24 13:26:59
回答 3查看 28.6K关注 0票数 28

假设我有以下模型:

代码语言:javascript
复制
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 )

一个网站的用户可以将他们的图片贡献给几个比赛。然后其他用户可以投票支持或反对他们。

一切都很好,但是现在我想显示一个页面,用户可以在这个页面上看到某个竞赛的所有贡献。图像应按其分数排序。因此,我尝试了以下方法:

代码语言:javascript
复制
Contest.objects.get( pk = id ).image_set.order_by( 'score' )

正如我担心的那样,它不能工作,因为'score'不是可以在查询中使用的数据库字段。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-01-24 13:44:38

哦,当然我忘记了Django中新的聚合支持和它的annotate功能。

因此查询可能如下所示:

代码语言:javascript
复制
Contest.objects.get(pk=id).image_set.annotate(score=Sum('vote__value')).order_by( 'score' )
票数 47
EN

Stack Overflow用户

发布于 2009-01-24 13:34:37

您可以非常简单地用Python编写自己的排序。

代码语言:javascript
复制
def getScore( anObject ):
    return anObject.score()
objects= list(Contest.objects.get( pk = id ).image_set)
objects.sort( key=getScore )

这很有效,因为我们对列表进行了排序,并将其提供给模板。

票数 9
EN

Stack Overflow用户

发布于 2009-01-24 13:36:40

db级order_by无法按模型的python方法对查询集进行排序。

解决方案是在Image模型中引入score字段,并在每次Vote更新时重新计算它。某种反正规化。当你可以按它排序的时候。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/476017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档