2008-10-31 3 views
8

django QuerySet API를 사용하여 M2M 릴레이션 칩 전체에서 완전 외부 조인에 대한 쿼리를 만들려면 어떻게해야합니까?django의 완전 외부 조인

지원되지 않습니다. 이렇게하려면 내 관리자를 만드는 것에 대한 힌트를 환영합니다. 추가

편집 : S. 로트 @ : 깨달음에 대한 감사합니다. OUTER JOIN은 응용 프로그램에서 필요합니다. 여전히 불완전한 경우에도 입력 된 데이터를 보여주는 보고서를 생성해야합니다. 결과가 새로운 클래스/모델이라는 사실을 알지 못했습니다. 당신의 힌트는 나를 약간 도와 줄 것입니다.

답변

11

Django는 일반적인 SQL 개념에서 "조인"을 지원하지 않습니다. 객체 탐색을 지원합니다.

관계형 조인 (내부 또는 외부)은 엔티티의 새로운 "클래스"를 만듭니다. 장고에 정의가없는 것. 따라서 돌아 오는 것들에 대한 클래스 정의가 없으므로 적절한 "결과 세트"가 없습니다. 누락 된 조합에 대한 없음으로 채워질 튜플을 정의하는 것이 최선입니다.

왼쪽 (또는 오른쪽) 외부 조인은 다음과 같습니다. 두 개의 분리 된 부분 집합, 즉 관련 엔티티 집합이있는 부분과 그렇지 않은 부분을 만듭니다.

for obj in Model1.objects.all(): 
    if obj.model2_set().count() == 0: 
     # process (obj, None) -- no Model2 association 
    else: 
     for obj2 in obj.model2_set.all(): 
      # process (obj, obj2) -- the "inner join" result 

"전체"외부 조인은 관계가없는 나머지 항목의 합집합입니다.

for obj2 in Model2.objects.all(): 
    if obj2.model1_set().count() == 0: 
     # process (None, obj2) -- no Model1 association 

문제는 항상 세 가지 다른 하위 집합 개체의 이상한 집합으로 무엇을 처리하고 있습니까?

오브젝트 데이터베이스의 포인트는 오브젝트와 연관된 오브젝트에 처리를 집중시키는 것입니다.

"관계형 조인"이라고하는 독특한 컬렉션은 원래의 개체 모델에 절대로 존재하지 않습니다. 두 개 (또는 그 이상)의 원본 개체로 만들어진 새로운 클래스의 개체입니다.

외부 조인은 여러 하위 클래스 (내부 조인, 왼쪽 외부 조인 및 오른쪽 외부 조인)가있는 컬렉션을 만듭니다. 그 물건 모음은 무엇입니까 의미?

잠깐, 더 심해질 수 있습니다. 처리 중에 누락 된 속성 (즉, if someObj.anObj2attribute is None : 우리는 본질적으로 객체가없는 Model1 항목을 찾고 있습니다. 음 ... 왜 외측 결합에 넣었습니까? if 문을 사용하여 필터링하는 이유는 무엇입니까? 이유는 단지 제대로 별도의 쿼리 각 부분 집합을 AMD의 과정을하지


편집 :.. 당신은 "불완전"상태를 표시 할 때, 그것은 외부 조인 전혀하지 않습니다 그것은 매우 간단 만들 필요가 템플릿에 대해보기 기능에서 하나 또는 두 개의 별도 컬렉션을 표시하십시오.

먼저 상태 코드를 사용해야하며 존재 여부는 나타내지 마십시오. 외래 키의 nce. 선택적인 외래 키는 "이유"가 없습니다 - 거기에 있거나 없어요. 상태 코드는 의미의 유용한 음영 ("불완전", "오류 있음", "손상됨", "적용 불가", "삭제 예정"등)을 제공 할 수 있습니다.)

errorList1 = Model1.objects.filter(status="Incomplete") 
errorList2 = Model2.objects.filter(status="Incomplete") 

이 두 개는 전체 외부 조인의 두 개의 비 조인 파트입니다. 그런 다음 적절한 열 제목과 상태 코드 및 모든 것을 사용하여 템플릿에 이러한 두 가지 오류 목록을 표시 할 수 있습니다.

심지어 기존의 완전 외부를 모방하기 위해 하나의 테이블로 넣을 수 있습니다 보고서에 가입

<table> 
    <tr><th>Model1</th><th>Model2</th></tr> 
    {% for e1 in errorList1 %} 
    <tr><td>e1</td><td>NULL</td></tr> 
    {% endfor %} 
    {% for e2 in errorList2 %} 
    <tr><td>NULL</td><td>e2</td></tr> 
    {% endfor %} 
</table> 

전체 외부 같은데 참조하는 데 사용 보고서의 사람들이 가입 할 수 있습니다. 완전 외부 조인이 필요하지 않습니다.

+0

당신 말이 맞습니다. 파이썬에서 "FULL OUTER JOIN"에 필요한 테이블을 계산 한 뷰를 작성한 다음 그 결과를 렌더링 용 템플릿에 전달합니다. 감사합니다. . – Ber