2009-07-12 2 views
0

어떻게하면 여러 제약 조건을 가진 레코드를 Django의 집계 기능을 사용하여 계산할 수 있습니까?Django 집계 기능을 사용하여 여러 개의 contrains을 필터링 할 수 있습니까?

django 트렁크를 사용하여 복잡한 데이터베이스 관련 SQL 문을 django 집계로 대체하려고합니다.

domains <- blog -> comment 

다음 SQL이에 대한 의견을 계산 : 예를 들어, 나는 각 복용 많은 의견 (.co.uk에서, .COM, .etc를 생각하는) 여러 도메인에서 실행중인 블로그를위한 테이블 구조 데이터베이스를 갖고 있다고 도메인 단위는 :


Domain.objects.annotate(Count('blogs__comments')) 
이 단계 푸르트 촬영 :

SELECT D.id, COUNT(O.id) as CommentCount FROM domain AS D 
LEFT OUTER JOIN blog AS B ON D.blog_id = B.id 
LEFT OUTER JOIN comment AS C ON B.id = C.blog_id 
GROUP BY D.id 

이 용이하여 복제

SELECT D.id, COUNT(O.id) as CommentCount FROM domain AS D 
LEFT OUTER JOIN blog AS B ON D.blog_id = B.id 
LEFT OUTER JOIN comment AS C ON B.id = C.blog_id 
    AND C.active = True 
GROUP BY D.id 

이 훨씬 더 어려운 장고는 WHERE 절 전체 shaboodle에 필터링을 포함한 보인다 복제하는 것입니다 : 어, 나는 다음과 같은 SQL을 하나 개 이상의 제약을 추가하고 복제 할 수 있도록하고 싶습니다 : 내가 적절한에 여분의 제약 조건을 팝업으로 장고를 설득 할 수있는 방법

SELECT ..., COUNT(comment.id) AS blog__comments__count FROM domain 
LEFT OUTER JOIN blog ON domain.blog_id = blog.id 
LEFT OUTER JOIN comment ON blog.id = comment.blog_id 
WHERE comment.active = True 
GROUP BY domain.id 
ORDER BY NULL 

:

Domain.objects.filter(blogs__comments__active=True) 
       .annotate(Count('blogs__comments')) 

SQL은 다음과 같이 나온다 LEFT OUTER JOIN? 댓글이없는 블로그의 수를 포함하고자 할 때 중요합니다.

+0

이 주제를 다시 연구 할 때 당분간이 문제를 해결할 수있는이 페이지를 보았습니다. http://www.voteruniverse.com/Members/jlantz/blog/conditional-aggregates-in-django – Mat

답변

0

Django 쿼리 언어를 사용하여이 작업을 수행하는 방법을 모르지만 원시 SQL 쿼리를 항상 실행할 수 있습니다.

from django.db import connection 

def some_method(request, some_parameter): 
    cursor = connection.cursor() 
    cursor.execute('SELECT * FROM table WHERE somevar=%s', [some_parameter]) 
    rows = cursor.fetchall() 

더 세부 장고 책을 온라인에서 사용할 수 있습니다 : 당신은 이미 그 방법을 모르는 경우에는 여기에서 예입니다 http://www.djangobook.com/en/2.0/chapter05/ 섹션는 ""멍청한 "방법에 대한

봐 뷰에서 데이터베이스 쿼리 수행 "을 참조하십시오. "멍청한"방법을 사용하고 싶지 않다면, 나는 당신의 선택이 무엇인지 모르겠습니다.

+0

나는 원래 그것은 SQL 질의를 사용하여 수행하지만, MySQL에서 PostgreSQL으로 바뀌면 배 모양이됩니다. 지금 수정했지만 ral SQL 쿼리를 피하는 것이 좋습니다. – Mat