본문 바로가기
소프트웨어 마에스트로/BackEnd(Django)

[백엔드] django serializer

by alpakaka 2024. 7. 24.

문제 상황

우리 모델의 경우 대략 아래와 같은 모델이다

1. 책장이 있다.

2. 책이 있다 (책장의 아이디를 가진다)

3. 페이지가 있다 (책의 아이디를 가진다)

 

이런 상황인데

 

get요청을 보내는 경우 문제가 있었다

일단 나는 nested로 대략 아래와 같이 보낸다

{
	책장 아이디 : 1
    책들 : 
    [
    	책 아이디 : 1
        페이지들 : [
        	페이지 아이디 : 1
            
        ],
        책 아이디 : 2
        ....
    ]

근데 이 경우에 문제가 있었다..

뭔가 특정 조건인 친구들이 나오면 안되는데, 계속 나오는거다...

그래서 일단 필터를 걸었다!

 

그랬더니 문제는 책장은 필터에 잘 걸리는데 책들과 페이지들은 해당 필터가 안걸리고 나온다!!

 

그래서.. 찾은 결과는 prefetch를 사용하라는 거였다!

그래서 사용해봤다.

기존 코드

책장들 = 책장.objects.filter( 조건문 ).order_by(order)

수정후 코드

책장들 = 책장.objects.filter( 조건문 ).order_by(order).prefetch_related(
	Prefetch('책들', queryset=책.object.filter(조건).order_by(order)
)

 

근데 이거의 문제는

나의 경우에는 페이지도 조건을 맞춰줘야하는거였다..!

그래서 아 serializer부터 다시 봐야하는 건가...

하다가 그냥 꼼수를 써보기로 했다

기존 코드

책장들 = 책장.objects.filter( 조건문 ).order_by(order).prefetch_related(
	Prefetch('책들', queryset=책.object.filter(조건).order_by(order)
)

수정후 코드

책장들 = 책장.objects.filter( 조건문 ).order_by(order).prefetch_related(
	Prefetch('책들', queryset=책.object.filter(조건).order_by(order).prefetch_related(
		Prefetch('페이지들', queryset=페이지.object.filter(조건).order_by(order)
	)
)

 

https://medium.com/chrisjune-13837/%EB%8B%B9%EC%8B%A0%EC%9D%B4-%EB%AA%B0%EB%9E%90%EB%8D%98-django-prefetch-5d7dd0bd7e15

 

당신이 몰랐던 Django Prefetch.

prefetch_related를 효율적으로 활용하면 가독성을 높이고 성능을 개선할 수 있습니다

medium.com

 

이 블로그를 보고 진행했다.

지금 봤을 때는 시간이 괜찮을지 좀 고민이 되서 내일 팀원분들과 상의해봐야겠다!