development/Mr.dJango 장고뽀개기

dJango ORM Select 절의 Subquery

foruheon 2020. 7. 31. 08:42

 

재판매하는 리셀러라는 테이블이 있다. 

리셀러는 1차 리셀러와 2차 리셀러가 있는데 1차 리셀러의 parent_id는 0로 하고 2차 리셀러는 1차 리셀러의 id값으로 한다.

2차 리셀러인 경우 1차리셀러의 리셀러명을 가져와야 하는데 이때는 SELECT SUBQUERY가 필요하다

 

SELECT `ReSeller`.`id`,
`ReSeller`.`parent_id`,
`ReSeller`.`sort`,
`ReSeller`.`reseller_name`,
`ReSeller`.`name`,
`ReSeller`.`contract_address`,
`ReSeller`.`email`,
`ReSeller`.`memo`,
`ReSeller`.`language`,
`ReSeller`.`created_date`,
`ReSeller`.`modified_date`,
(SELECT U0.`reseller_name` FROM `ReSeller` U0 WHERE U0.`id` = `ReSeller`.`parent_id`) AS `seller1`
FROM `ReSeller`
WHERE `ReSeller`.`language` = 'ko_KR'
ORDER BY `ReSeller`.`created_date` DESC

 

쿼리는 위와 같다

 

이것을 장고 ORM으로 표현하면 아래와 같다

 

reseller = ReSeller.objects.filter(language=language).order_by(sort_field)

1차 쿼리의 셀렉트 조건

 

reseller = reseller.annotate(
reseller1=Subquery(ReSeller.objects.filter(id=OuterRef('parent_id')).values('reseller_name')))