2013-04-27 160 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