본문 바로가기
IT/Python

Django, n+1 문제해결을 위한 select_related, prefetch_related

by Cyber_ 2024. 11. 7.

select_realted

select_related는 SQL의 JOIN 연산을 사용하여, 관련된 객체를 단일 쿼리로 데이터베이스로부터 미리 로드합니다. 이 메서드는 1:1 또는 1:N 관계에 사용되며, 데이터베이스의 부하를 감소시키는 데 효과적입니다.

from django.db import models

class Author(models.Model):
    name = models.ChareFiled(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

## 쿼리
books = Book.objects.select_related('author').all()
for book in books:
    print(book.title, book.author.name)

prefetch_related

prefetch_related는 Python 코드 내에서 별도의 쿼리르 수행하여 관련 객체르 자져오고, 이를 메모리에 캐싱하여 사용합니다. 이 방법은 N:N 또는 1:N 관계에서 유용하며, 특히 여러 관계를 거쳐 정보를 가져와야 할 때 유용합니다.

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    books = models.ManyToManyField('Book', related_name='authors')

class Book(models.Model):
    title = models.CharField(max_length=100)

#쿼리

authors = Author.objects.prefetch_related('books').all()
for author in authors:
    print(author.name)
    for book in author.books.all():
        print(book.tilte)