2011-04-23 53 views
5

我试图做一个“group by”来拉出一个测验所有者测验中所有猜测的列表,分组由用户进行注释并且用对用户已经做出多少次猜测的计数进行了注释。Django“group by”via annotations:从.value()获取对象对一个ID

相关机型:

class Quiz(models.Model): 
    user = models.ForeignKey(User) 
    ... 

class Guess(models.Model): 
    user = models.ForeignKey(User) 
    quiz = models.ForegnKey(Quiz) 
    ... 

这个查询:

guessors = Guess.objects.filter(quiz__user=request.user).values('user').annotate(cnt=Count('user')).order_by('cnt') 

返回这样的事情,这是非常接近我所需要的:

{'cnt': 5, 'user': 5} 
{'cnt': 3, 'user': 4} 
{'cnt': 2, 'user': 3} 
{'cnt': 1, 'user': 2} 

注意,但是,当我想要的是一个完整的用户对象时,'user'被作为int返回。有关如何最有效地获取完整用户对象的任何建议?

+0

注:我在Django 1.3上 – mitchf 2011-04-23 03:54:49

回答

4

在我短暂而紧张的时间与Django,我发现group_by函数是我最想念的SQL功能之一。我已经尝试了上面使用的values()聚合方法,但遇到了同样的问题,我想要返回一个对象。我结束了使用raw SQL,这不是很漂亮,但为我所需要的。

1

一种选择是尝试使用双下划线符号让所有的用户领域,因此,例如,你可以做类似的值(“用户_ 用户名”,“用户 _someOtherField”)。我不确定要获取整个用户对象,也许其他人可以获得更多的帮助。