Django查询聚合

时间:2012-03-16 09:01:53

标签: django aggregation

想象一下一个数字猜谜游戏,其中一个人想到一个数字而另一个人必须猜测它。如果猜到正确的数字,游戏就结束了。

模型可能如下所示

class SecretNumber(models.Model):
    number = models.IntegerField()

class Guess(models.Model)
    secretnumber = models.Foreignkey(SecretNumber)
    guess = models.IntegerField()

播放四次后,数据库可能如下所示:

id  number  
==========
1   10
2   54
3   68
4   25

id  secretnumber_id     guess
=============================
1   1                   50
2   1                   30
3   1                   10
4   2                   99
5   2                   60
6   2                   54
7   3                   1
8   3                   68
9   4                   73
10  4                   34
11  4                   86
12  4                   51
13  4                   25

正如你所看到的,猜测是非常幸运的:他花了3次,3次,2次和4次猜测。但这只是为了保持这个例子简短。 现在我需要提出一个查询,它将允许显示以下数据:

Nb. guesses     Count   
=====================
2               1
3               2
4               1

手动SQL语句如下所示:

SELECT inner_count AS 'Nb. guesses', count(inner_count) AS 'Count' FROM (
  SELECT secretnumber_id, count(id) AS inner_count FROM guess GROUP BY secretnumber_id
) GROUP BY inner_count

我考虑过注释注释,但这似乎不可能。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果你正在使用django(即模型而不是类),你想使用QuerySet aggregate functions

e.g。

from django.db.models import Count
guesses = Guess.objects.values('secretnumber').annotate(Count('secretnumber'))

这将为您提供一个包含对象列表的查询集,这些对象具有秘密编号和计数值。