计算django中的群组平均值

时间:2011-05-03 21:53:38

标签: django

我想知道Django如何在每个元素的表格中获得平均分组元素数量(如果可能的话,不使用.extra(...))。

具体地说,我有一个由矮人和蛋糕组成的桌子(DwarvesEatingCakes)。每对(矮人,蛋糕)都是独一无二的。我想得到每个矮人吃的平均蛋糕数量。

以下代码似乎不起作用:

avg_cakeeaten_dict = DwarvesEatingCakes.values('dwarf').annotate(num_cake=Count('cake')).aggregate(avg_cake_eaten=Avg('num_cake'))

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我最终使用的答案如下(根据Rob的回答):

num_entries = DwarvesEatingCakes.objects.count() # get the number of entries
num_dwarves = DwarvesEatingCakes.objects.aggregate(num_dwarf=Count('dwarf', distinct=True))
return num_entries / float(num_dwarves['num_dwarf'])

当然你也可以将你的检查除以0.虽然这是一个相对常见的地方查询,但可能有一种标准的方法。

答案 1 :(得分:0)

我不确定我是否正确理解你,但我认为你想要计算这个单一数字(使用PostgreSQL语法):

SELECT CAST(COUNT(DISTINCT cake_id) AS REAL) / COUNT(DISTINCT dwarf_id) FROM dwarves_eating_cakes

如果你自己加入表(开始handwaving),有可能在单个QuerySet中有一些方法可以做到这一点,但这对我来说既低效又笨拙。就个人而言,我倾向于直接发出查询:

def cake_average() :
  from django.db import connection
  c = connection.cursor()
  c.execute("SELECT CAST(COUNT(DISTINCT cake_id) AS REAL) / COUNT(DISTINCT dwarf_id) FROM dwarves_eating_cakes")
  return c.fetchall()[0][0]

此方法的一个优点是您可以扩展此功能以在同一查询中计算其他统计信息。