Django“group by”通过注释:从.value()获取对象与ID

时间:2011-04-23 03:39:35

标签: django orm annotations group-by

我正在尝试相当于“分组依据”,在测验所有者的测验中提取​​所有猜测的列表,按用户分组并注释用户已经进行了多少次猜测。

相关型号:

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对象时,'user'作为int返回。有关如何最有效地获取完整User对象的任何建议吗?

2 个答案:

答案 0 :(得分:4)

在我与Django的短暂但激烈的时间里,我发现group_by函数是我最想念的SQL功能之一。我已经尝试了你上面使用的values()聚合方法,但是我想要一个返回的对象有同样的问题。我最终使用raw SQL,这不是很漂亮但是为我需要的东西工作。

答案 1 :(得分:1)

一种选择是尝试使用双下划线表示法获取所有用户字段,例如,您可以执行类似值('user_ username','user _someOtherField')的操作。我不确定是否可以获得整个用户对象,其他人可能会对此有更多的帮助。