Django 기타 메소드 | prefetch related, select related, anotate 등

Yeseul Han·2022년 8월 16일
0

모델 메소드

1. prefetch_related와 select_related를 사용해 쿼리수 줄이기

About Lazy Loading : prefetch_related와 select_related를 사용하지 않으면...!

users = User.objects.all()
orders = Order.objects.all()

user_list = list(users)

장고 ORM은 정말 필요한 만큼만 호출한다.

쿼리셋을 선언하면 선언 시점에는 쿼리셋에 지나지 않는다. 실제로 유저 리스트가 넘어오는 시점은 리스트로 묶어주고 사용하는 시점!!

하나의 쿼리셋을 불러올때 related object를 불러와 미리 캐시에 넣기 때문에
쿼리 갯수를 줄일 수 있다!!! DB에 접근 하는 횟수가 줄기 때문에 속도도 up!!!!
쿼리 최적화를 위해 필수적이다!

여러개 set의 오브젝트를 불러올때 사용 -> ManyToManyField, reverse ForeignKey

    def get(self, request):
        user = request.user
        header = Header.objects.by_user(user=user.id).prefetch_related('header').order_by('-created_at')
        header_serializer = HeaderSerializer(header, many=True, context={'header':header}).data
        return Response(header_serializer, status=200)

단일 오브젝트를 불러올때 사용 -> OneToOneField, ForeignKey

Q 둘중에 하나를 쓸 수 있다면???

당연히 1개의 쿼리를 가져오는 selected_related가 더 좋음!! :)

select related 실제 실험

2. annotate/aggregate/value

anotate🔥

    def get(self, request):
        articles = Article.objects.all()
        top_articles = articles.annotate(like_count=Count('like')).annotate(comment_count=Count('comment')).order_by('-like_count')[:9]
        top_articles = ArticleSerializer(top_articles, many=True)
        return Response(top_articles.data, status=status.HTTP_200_OK)

annotate의 뜻은 주석을 달다. 보통 주석을 annotation이라고 하니까ㅇㅇ

마치 엑셀에서 컬럼을 하나 새로 만드는 것과 같다는 한 블로그 글을 봤는데 꽤 그럴듯하다고 생각된다.
우리 수식에서는 Count를 사용했지만 다른 장고 모델 메소드도 사용 가능하다.

from django.db.models import F, Sum, Count, Case, When 같은 것 말이다.

좀 더 실험을 해볼 가치가 있는것 같다.

profile
코딩 잘하고 싶다

0개의 댓글