2017-10-30 3 views
0

현재 django로 다중 내부 조인을 사용하여 복잡한 Q- 개체 쿼리를 작성하는 데 문제가 있습니다.장고 쿼리 - 다중 내부 조인

우리가 얻고 자하는 모델 (예제에서 'main'이라고 함)은 외래 키가있는 다른 모델에 의해 참조됩니다. 아래 예에서 역 참조를 '관련'이라고합니다. 두 번째 모델의 많은 객체가 모두 동일한 '주'객체를 모두 참조하며 ID와 값을가집니다.

ID가 7113 인 관련 객체의 값이 1이고 관련 객체의 ID가 7114이고 값이 0 인 모든 '주요'객체가 필요합니다.

FROM `prefix_main` INNER JOIN `prefix_related` a INNER JOIN `prefix_related` b [...] WHERE (a.`id` = 7313 AND a.`value` = 1 AND b.`id` = 7314 AND b.`value` = 0) 

가 어떻게이 ORM 쿼리를 다시 작성할 수 있습니다 : 우리가 필요로하는 것이 무엇인가하는 것은 전혀 다르다

(Q(related__id=u'7313') & Q(related__value=1)) & (Q(related__id=u'7314') & Q(related__value=0)) 

이 코드는 평가

FROM `prefix_main` INNER JOIN `prefix_related` [...] WHERE (`prefix_related`.`id` = 7313 AND `prefix_related`.`value` = 1 AND `prefix_related`.`id` = 7314 AND `prefix_related`.`value` = 0) 

에 :

이 우리의 현재 쿼리입니다 두 개의 INNER JOINS를 사용하려면/q 객체에 대해 서로 다른 인스턴스를 사용 하시겠습니까? 미리 감사드립니다.

답변

1

나는 이것을 위해 Q- 오브젝트가 필요 없다고 생각합니다. 이 같은 여러 개의 필터를 바로 사용할 수 있습니다 :

Mainmodel.objects.filter(related__id = 7114, related__value=1).filter(related__id = 7113, related__value=0) 

첫 번째 필터는 ID 7113 및 값으로 다시 한 번 필터링 된 ID 7114 및 값 1 반환 된 객체와 관련 개체가 모든 개체를 일치 0

+0

예 -이 솔루션은 "AND"조건에서 잘 작동합니다. 감사! 우리는 "OR"에 대해서도 잘 작동하는 솔루션을 찾으려고 노력하고 있음을 잊어 버렸습니다. 우리의 경우에이 쿼리는 다음과 같이 작동해야합니다 : FROM'prefix_main' INNER JOIN'prefix_related' [...] WHERE (' prefix = "7314 AND'prefix_related'.value = 1 OR'prefix_related'.idid = 7314 AND'prefix_related'.value' = 0)' –

+1

@DanielK. 이 경우에는 다음과 같이하면됩니다 :'Mainmodel.objects.filter (Q (related__id = 7114, related__value = 1) | Q (related__id = 7113, related__value = 0))' – lilaLeon

+0

우리의 필터는 다른 필터 규칙과 동적으로 결합됩니다. 런타임이므로 두 경우 모두 거의 동일하게 작동하는 단일 솔루션을 선호합니다. 하나의 구문 (두 개의 필터 호출 또는 Q 개체 사용)을 사용하여 두 경우를 모두 포함하는 변경 사항을 확인하십니까? –