2013-04-27 129 views
0

我有以下型号嵌套聚合函数在Django

class Domain(models.Model): 
    domain = models.URLField() 
    web_analytics = models.ManyToManyField('AnalyticsProvider', blank=True) 

class AnalyticsProvider(models.Model): 
    name = models.CharField(max_length=50) 

我想每个域分析的数量,他们通过分析数它们聚集。我想得到这样的结果: { “1和分析服务提供商”: “520个域名”, “2次的分析服务提供商”: “130个域名”, ...}

。我管理与SQL查询来做到这一点,但我想用Django的ORM,SQL查询如下:

SELECT COUNT(1),"num_m2m" from (SELECT "dashboard_domain"."id_website", COUNT("dashboard_domain_web_analytics"."analyticsprovider_id") AS "num_m2m" 
FROM "dashboard_domain" LEFT OUTER JOIN "dashboard_domain_web_analytics" 
ON ("dashboard_domain"."id_website" = "dashboard_domain_web_analytics"."domain_id") 
GROUP BY "dashboard_domain"."id_website") GROUP BY "num_m2m"; 

我试图做一个双注释中,如查询集:

number_web_analytics = Domain.objects.annotate(num_m2m=Count('web_analytics')).annotate(count_domains=Count('num_m2m')) 

但似乎django不能做另一个注释。

回答

0

你说你想要每个域的分析数量。

那么,为什么不只是一个注释:

number_web_analytics = Domain.objects.annotate(num_m2m=Count('web_analytics')) 

,你可以得到分析的数第一DOMIAN为:

number_web_analytics[0].num_m2m 
+0

对不起,我可能没有解释清楚。这就是我所拥有的,现在我想按分析数量对域进行分组。 – fasouto 2013-04-27 09:41:22

-1

的ORM变得非常复杂的查询,令人费解。如果你不能弄清楚,你总是可以简单地执行原始的SQL就像这样:

>>> for p in Person.objects.raw('SELECT * FROM myapp_person'): 
...  print(p) 
John Smith 
Jane Jones 

https://docs.djangoproject.com/en/dev/topics/db/sql/

+0

我知道,但我计划重复使用不同模型的查询。我想这是做到这一点的唯一方法。感谢您的答复。 – fasouto 2013-04-28 19:47:50

+0

使用原始查询是有史以来最糟糕的想法。这会在未来造成更严重的问题。 – 2017-08-10 09:26:11