Django中的嵌套聚合函数

时间:2013-04-27 00:03:08

标签: django annotations

我有以下型号

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不能对另一个进行注释。

2 个答案:

答案 0 :(得分:0)

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

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

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

您可以获得第一个多米安的分析数量:

number_web_analytics[0].num_m2m

答案 1 :(得分:-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/