반응형
[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
반응형
'파이썬 웹 개발' 카테고리의 다른 글
[Django] The Zen of Python, by Tim Peters _출력구문에서 제거하는 방법 (0) | 2022.05.20 |
---|---|
[Django] 파이썬 장고 네이버 검색 API _ 뉴스 검색 (0) | 2022.05.14 |
[Django] ManyToManyField 추가 및 삭제 방법_ 예제 (0) | 2022.05.10 |
[Django] List 안에 dict key값으로 정렬하기 _OUTER JOIN 대체 방법 (0) | 2022.04.22 |
[Python Django] 월별 sum, count 집계함수 orm group_by (0) | 2022.04.19 |
댓글