2013-04-27 3 views
0

에서 나는 다음과 같은 모델중첩 집계 함수 장고

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 개 도메인", "이 개 분석 제공 업체": "130 개 도메인", ...}

나는 같은 결과를 얻을 싶어요.

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

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"; 

내가 같은 검색어 세트에 이중 주석을 시도 : 내가 SQL 쿼리와 함께 할 관리,하지만 난 장고 ORM을 사용하려면, SQL 쿼리는 다음과

그러나 장고는 다른 하나에 주석을 수행 할 수없는 것 같습니다.

답변

0

도메인 당 분석 수를 원한다고 가정 해보십시오.

그래서 왜 안 하나의 주석 :

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

그리고 당신은 같은 domian 첫번째에 대한 분석의 수를 얻을 수 있습니다 :

number_web_analytics[0].num_m2m 
+0

죄송합니다. 나는 그것을 잘 설명하지 않습니다. 이것이 내가 가진 것인데, 이제 분석의 수로 도메인을 그룹화하려고합니다. – fasouto

-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

+0

원시 쿼리를 사용하는 것은 최악의 아이디어입니다. 그것은 앞으로 더 심각한 문제를 일으킬 것입니다. –