select_related & prefecth_related

백승찬·2020년 11월 22일
0

django

목록 보기
7/11
  • 쿼리를 실행할 때 추가적인 관련 객체 데이터를 선택하여 외래키 관계를 팔로우 할 QuerySet을 반환한다.
# models
from django.db import models

class City(models.Model):
    # ...
    pass

class Person(models.Model):
    # ...
    hometown = models.ForeignKey(
        City,
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
    )

class Book(models.Model):
    # ...
    author = models.ForeignKey(Person, on_delete=models.CASCADE)

Book.objects.select_related('author__hometown').get(id=4)
호출하면 관련 Person과 관련 City가 캐시된다.

  • 지정된 각 조회에 대해 단일 배치에서 관련 객체를 자동으로 검색하는 QuerySet을 반환
    select_related와 비슷 하지만 전략은 완전히 다름

select_related는 SQL join을 생성하고 SELECT 문에 관련 객체의 필드를 포함시켜 작동한다. 그렇기 때문에 select_related는 동일한 DB 쿼리에서 관련 객체를 가져온다. 그러나 많은 관계가 조인하여 발생하는 큰 결과셋을 피하기 위해 select_related는 외래키와 one-to-one 관계로 제한한다.

  • prefetch_related는 각 관계에 대해 별도로 조회하고 파이썬에서 joining을 수행

  • select_related에서는 할 수 없는 many_to_many, many_to_one 객체에서도 사용 가능

기본 QuerySet의 결과 캐시와 지정된 모든 관련 객체를 메모리에 완전히 불러온다. 일반적으로는 DB에서 쿼리가 실행 된 후에도 필요한 모든 객체를 메모리에 로드하지 않는다.

0개의 댓글