본문 바로가기
파이썬 웹 개발

[Django] 파이썬 장고 서브쿼리(orm subquery) 예제 _ SQL과 비교하기

by 배추잠자리 2022. 5. 12.
반응형

[Django] 파이썬 장고 서브쿼리(orm subquery) 예제 _ SQL과 비교하기

 

■ Model 예시

모델의 샘플

 

 

Account 테이블을 조회하면서 서브쿼리로 FeedCommnet와 Feeditem 테이블을 같이 출력해보자.

 

# 먼저 하기와 같이 Subquery, OuterRef 가 import 되어있야아 한다.

from django.db.models import Subquery, OuterRef

 

■ 장고 ORM Subquery 예시

 

 

서브쿼리 안에 포함된 FROM절 테이블의 parentid와 OuterRef('비교할 쿼리의 FROM절 컬럼') 즉 Account의 컬럼인 id_number이 되는 WHERE절 비교 대상이 되는 것이다.

 

Account.objects.annotate(feed=Subquery(sub1.values('body')),
                                            feed_comment=Subquery(sub2.values('body'))
                                            ).values('id_number', 'name', 'feed', 'feed_comment').all()

 

1. 빨간 부분은 서브쿼리의 alias(별칭) 이라고 보면 되고,

2. 진한 부분은 서브쿼리에서 출력될 컬럼으로 보면된다.

3. 밑줄 부분은 최종적으로 리턴되는 컬럼들이다.

 

# 중요한 것은 values('') 부분에서 서브쿼리 where절에 사용된 컬럼과 서브쿼리의 alias(별칭)이 values 안에 포함되어야 한다.

 

 

■ SQL문과 비교하기

 

# SQL

SELECT id_number, name,
(select body from Feeditem where parentid = A.id_number ) as feed,
(select body from Feedcomment where parentid = A.id_number ) as feed_comment
FROM Account A

 

# 장고 서브쿼리

sub1 = Feeditem.objects.filter(parentid=OuterRef('id_number'))  # 서브쿼리 1
sub2 = Feedcomment.objects.filter(parentid=OuterRef('id_number'))  # 서브쿼리 2

# ORM 쿼리셋
Account.objects.annotate(feed=Subquery(sub1.values('body')),
                         feed_comment=Subquery(sub2.values('body'))
                         ).values('id_number', 'name', 'feed', 'feed_comment').all()

 

 

# 파이썬 장고 서브쿼리  # 장고 subquery

반응형

댓글