Django ORM에서 제공하는 고급 기능들을 활용하면 복잡한 데이터베이스 쿼리를 파이썬 코드로 쉽게 작성할 수 있습니다.
오늘은 annotate
, Window
, F
객체의 사용법과 실제 활용 사례를 살펴보겠습니다.
F()
객체는 데이터베이스의 필드 값을 직접 참조할 수 있게 해주는 도구입니다. 실제 값을 파이썬으로 가져오지 않고 데이터베이스 수준에서 처리할 수 있게 해줍니다.
from django.db.models import F
# 조회수 증가 예제
Post.objects.filter(id=1).update(views=F('views') + 1)
이 코드는 다음 SQL과 유사합니다:
UPDATE post SET views = views + 1 WHERE id = 1;
윈도우 함수는 행들의 집합(윈도우)에 대해 계산을 수행하는 SQL 함수입니다. Django에서는 Window
클래스를 통해 이를 구현할 수 있습니다.
게시글에 행 번호를 부여하는 예제를 살펴보겠습니다:
from django.db.models import F
from django.db.models.expressions import Window
from django.db.models.functions import RowNumber
posts = Post.objects.annotate(
row_num=Window(
expression=RowNumber(),
order_by=F('id').desc()
)
)
이는 다음 SQL과 유사합니다:
SELECT *,
ROW_NUMBER() OVER (ORDER BY id DESC) as row_num
FROM post;
annotate()
는 쿼리셋에 임시 필드를 추가하는 메서드입니다. 계산된 필드나 집계 결과를 추가할 때 사용합니다.
# 댓글 수 계산
from django.db.models import Count
posts = Post.objects.annotate(
comment_count=Count('comments')
)
위의 모든 기능을 조합한 실제 활용 예제를 살펴보겠습니다:
from django.db.models import F, Window
from django.db.models.functions import RowNumber
class PostView(TemplateView):
def get_context_data(self, **kwargs):
# 게시글 목록 가져오기
posts = (
Post.objects.annotate(
# 행 번호 부여
row_num=Window(
expression=RowNumber(),
order_by=[F('id')]
)
)
.exclude(status='DELETED') # 삭제된 게시글 제외
.order_by('-id') # 최신순 정렬
)
return {'posts': posts}
Django ORM의 고급 기능들을 활용하면 복잡한 데이터베이스 작업을 파이썬 코드로 깔끔하게 표현할 수 있습니다.
하지만 각 기능의 특성과 성능 영향을 이해하고 적절히 사용하는 것이 중요합니다.