Django ORM

mkhome·2021년 10월 29일
0

django

목록 보기
3/6

QuerySet 특징

  1. Lazy Loading - 필요한 시점에 SQL을 호출 == 필요하지 않으면 SQL을 호출하지 않는다 -> queryset을 전체로 선언해도 마지막에 필요한 것만 부른다
  2. Caching : QuerySet 캐싱을 재 사용하면 된다.
    • 호출하는 순서에 따라서 SQL이 달라질수도 있다.

Eager Loading - N+1 Problem

queryset = Users.objects.all()
for user in queryset:
	users.userinfo

--> 해당 예시에선 초기 queryset을 선언했지만 for문을 돌면서 계속해서 새롭게 sql을 쏜다.(user의 수만큼 sql이 쌓인다)

QuerySet 상세

  • Queryset은 1개의 쿼리와 0~N개의 추가쿼리(셋)으로 구성되어있다.

  • select_related & prefetch_related(역방향 참조)

Model.objests.filter(조건절)
.select_related('정방향 참조 필드')   		
.prefetch_related('역방향 참조 필드')
select * from 'Model' m
(inner or left outer) join '정방향 참조 필드' r on m.r_id=r.id
where 조건절
select * from 역방향 참조 필드 where id in (첫번째 쿼리 결과 id 리스트)
  • prefetch_related는 추가 쿼리셋 이다.

Query Test

from django.test.utils import CaptureQueriesContext
from rest_framework.test import APIClient

0개의 댓글