안녕하세요. 눈팅회원인데 궁금한점이 있어 질문 드립니다. 장고 모델을 사용하여 일대다 관

 
조준우

안녕하세요.
눈팅회원인데 궁금한점이 있어 질문 드립니다.
장고 모델을 사용하여 일대다 관계인 두 테이블 L과 R 을 조인해서 값을 조회할때 values() 함수를 사용하니 내부적으로 LEFT OUTER JOIN 해서 값을 리턴하던데요.

문제는 R테이블에 관계된 레코드가 2개 이상이라서 그냥 JOIN하게 되면 L테이블의 레코드가 중복으로 셀렉트될때 입니다. 페이징을 해야되서 이럴때 R테이블의 레코드에 제약을 JOIN의 ON 절에 줘서 1:1로 만들어논 다음에 JOIN을 하려고 하니 ON 절에 추가 조건이 들어가야되는데…어떻게 해야할지 막막하고 잘모르겠더군요. filter함수도 만져봤는데 where절에 추가 조건이 들어가서 의도한것처럼 구현이 안되더군요.

QuerySet API reference에 select_related, prefetch_related 두 함수를 읽어봐도 정확이 이런 용도는 아니고요. 그래서 그냥 raw를 써서 쿼리를 바로 날려 해결했는데….먼가 좀 석연찮네요. StackOverflow같은데도 검색해보니 그냥 raw써라 하던데요.

LEFT OUTER JOIN에서 꽤 빈번하게 일어나는 조인 상황인데 이게 구현이 안되어있다는게 좀 이상하기도 하고해서 질문을 드려봅니다.

QuerySet API reference를 읽어본바로는 OnetoMany 이긴 하지만 그냥 ManytoMany로 필드를 만들고 prefetch_related를 써서 R테이블의 내용을 캐쉬시켜서 메모리에 올린상태에서 어떻게 해보거나 아니면 그냥 L테이블에 레코드가 늘어나더라도 이렇게 해서
페이징을 제대로 하는 방법이 있거나…등으로 추측해볼 수 있는데
어떻게 처리해야 하는지 문의드립니다.

Advertisements