2010-07-19 2 views
2

"my_data"라는 테이블 위에 만든 MainData라는 django에 데이터 모델이 있습니다. django API를 통해이 테이블의 맨 위에 간단한 계산을 수행하고 싶습니다. 쿼리는 다음과 같습니다.django를 사용하여 테이블에 대한 간단한 조인 만들기

select main.id,     
     sum(main.num - secondary.num) as result 

from (select * from my_data 
     where some_value > 10) as main, 

     my_data as secondary 

where 
     main.id != secondary.id and 
     main.a > secondary.a 
group by main.id 

MainData 모델에는 모든 관련 필드 (num, id, a 및 some_value)가 있습니다. 어떻게 장고를 통해이 쿼리를 구현할 수 있습니까? 그것은 유사한 것,이 질문을 시도해보십시오 도움

+1

답장을 보내 주신 모든 분들께 감사드립니다. 위와 같은 작업은 장고에서 가능하지 않습니다. 쿼리를 다시 작성하고 조인으로 그룹을 사용하는 대신 내부 선택 (main.id 선택, (<계산 선택>) 선택)을 사용하면 "추가 {select = ...}) 원시 SQL이 필요할 수도 있습니다 ... – Liz

답변

0

에 대한

감사합니다 (I 직접 SQL을 사용하지 않도록하기 위해 노력하고있어) : 힘든 하나

Django equivalent for count and group by

+0

감사합니다. 여기서는 관계가 없으므로 참여가 불가능할 것 같습니다. – Liz

0

합니다. Django는 SQL에 의존하지 않고 테이블 자체에 쉽게 가입 할 수있는 방법을 제공하지 않습니다. 다음은 SQL을 사용하지 않고도 얻을 수있는 최선의 방법입니다. results 변수에 반환 된 결과는 사용자가 제공 한 SQL 쿼리에서 얻은 결과와 동일합니다. 그러나 실행은 다소 덜 효율적입니다.

from django.db.models import Sum, Count 
from your_app.models import MyData 
results = [] 
for m in MyData.objects.filter(some_value__gt=10): 
    result = MyData.objects.filter(a__lt=m.a).aggregate(
     count=Count('num'), sum=Sum('num')) 
    if result['count']: 
     results.append({ 
      'id': m.id, 
      'result': result['count'] * m.num - result['sum']}) 
print results 

당신은 또한 당신이 여전히 Djangoesque 일을 유지 효율적으로하면서 같은 당신 같은 복잡한 쿼리를 만들 수 있도록 할 장고 QuerySets 위해 제공하는 extra()raw() 방법을 살펴 있어야합니다.

+0

도움을 주셔서 감사합니다. if 효율적인 방법을 원한다면 장고가 지원하는 정규 조인 대신 내부 선택을 사용하도록 내 쿼리를 다시 작성하는 것이 가장 좋습니다. 어쨌든 직접 SQL이 가장 좋은 방법 인 것 같습니다. – Liz

관련 문제