select_related & prefecth_related
select_related()
- 쿼리를 실행할 때 추가적인 관련 객체 데이터를 선택하여 외래키 관계를 팔로우 할 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가 캐시된다.
prefecth_related()
- 지정된 각 조회에 대해 단일 배치에서 관련 객체를 자동으로 검색하는 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에서 쿼리가 실행 된 후에도 필요한 모든 객체를 메모리에 로드하지 않는다.
Author And Source
이 문제에 관하여(select_related & prefecth_related), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@14_seungchan/selectrelated저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)