날짜: 2023-04-09
예제코드용 모델
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
transaction.atomic(using="write_db")
→ 믿을게 못됨 (그 안에서도 read DB 참조)MyModel.objects.using("write_db")
사용하기 (직접 참조하므로 DB router를 아예 참조하지 않음)# Author와 관련된 Book을 가져올 때 select_related() 사용 예시
author = Author.objects.get(id=1)
books = Book.objects.filter(author=author).select_related('author')
# 여러 개의 쿼리를 사용하여 관련된 객체를 가져올 때 prefetch_related() 사용 예시
authors = Author.objects.all().prefetch_related('book_set')
# 필요한 필드만 선택하여 가져오기 (values() 메서드 사용 예시)
books = Book.objects.filter(published=True).values('title', 'author__name')
# 필요한 필드만 선택하여 가져오기 (values_list() 메서드 사용 예시)
books = Book.objects.filter(published=True).values_list('title', 'author__name')
# 필요한 필드만 선택하여 가져오기 (only() 메서드 사용 예시)
books = Book.objects.filter(published=True).only('title', 'author')
# 특정 필드를 제외하고 가져오기 (defer() 메서드 사용 예시)
books = Book.objects.filter(published=True).defer('description')
# 여러 개의 객체를 한 번에 생성하는 예시
books = [Book(title="book1"), Book(title="book2"), Book(title="book3")]
Book.objects.bulk_create(books)
# 여러 개의 객체를 한 번에 업데이트하는 예시
books = Book.objects.filter(published=True)
books.update(published=False)
# iterator() 메서드 사용 예시
books = Book.objects.all().iterator()
for book in books:
print(book.title)
from django.core.cache import cache
from myapp.models import Product
def get_products():
# 쿼리 결과를 캐시에서 가져오기
cached_products = cache.get('products')
if cached_products is not None:
return cached_products
# 쿼리 실행 및 캐시 저장
products = Product.objects.all()
cache.set('products', products, timeout=3600)
return products
print(queryset.query)
N+1 query problem
이 발생한다는 점을 늘 인지할 것.