2013-04-26 56 views
2

我有一些MySQL的代码看起来像这样:Django的总和与计数

SELECT 
visitor AS team, 
COUNT(*) AS rg, 
SUM(vscore>hscore) AS rw, 
SUM(vscore<hscore) AS rl 
FROM `gamelog` WHERE status='Final' 
     AND date(start_et) BETWEEN %s AND %s GROUP BY visitor 

我想翻译成查询的Django的版本,未做多个查询。这可能吗?我读了如何做Sum()Count(),但它似乎并没有工作,当我想比较像我在做的两个领域。

这是我能想出迄今最好的,但它没有工作......

vrecord = GameLog.objects.filter(start_et__range=[start,end],visitor=i['id'] 
           ).aggregate(
              Sum('vscore'>'hscore'), 
              Count('vscore'>'hscore')) 

我也有使用'vscore>hscore'试过了,但也不能工作。有任何想法吗?我需要尽可能少地使用查询。

+0

即时猜测你'vscore'和'hscore'为您示范田?你必须做一个'filter(vscore__gt = hscore)'并计算总和,我相信,但如果你想少做SQL查询,我会使用'.extra()'并自己提供原始的sql。它会更加优化。 – 2013-04-26 12:59:36

+0

感谢limelights,我可能会这样做。我真的不想使用原始SQL,但我想没有其他办法。 – Zamphatta 2013-04-26 14:48:02

回答

0

聚合仅适用于Django ORM中的单个字段。我查看了各种聚合函数的代码,并注意到单字段限制是硬连线的。基本上,当你使用Sum(field)时,它只是记录下来,然后将它传递给特定于数据库的后端以转换为SQL并执行。显然,聚合和注解在SQL中没有标准化。

无论如何,你可能需要use a raw SQL query.

+0

谢谢。我一直希望避免原始SQL,以便该应用程序可以在任何数据库中使用。我想我必须走这条路。 – Zamphatta 2013-04-26 14:49:16

+0

我认为任何避免原始SQL的解决方案都需要作为Django的更新来完成。 – 2013-04-26 17:40:56