[Django] SerializerMethodField

2023. 6. 19. 16:12Python/Django

글 내용

SerializerMethodField 사용 시 N+1 문제가 발생할 수 있는 상황에 대한 정리

 

SerializerMethodField의 장점

  • 모델에 없는 데이터 정의 후 사용
  • 유연성 및 데이터 정의
  • 동적으로 필드 구현
  • 등등

 

위와 같은 장점이 있지만 주의점이 존재

 

N+1 상황

  • 아래와 같은 방식으로 작성 시에 team에 대해서 Prefetch가 되어 있어도 N+1문제가 발생

Prefetch

User.objects.prefetch_related(
	Prefetch(
    	'consultings'
        queryset=Consulting.objects.filter(status=1)
    )
)

Serializer

class UseSerializer(ModelSerializer):
	consulting_list = SerializerMethodField()
    
    def get_consultings(self, obj):
    	consulting_list = obj.consultings.valeus('reserved_date')
        
       	return consulting_list

 

해결 방법

  • attr_to를 통해 list로 prefetch 후 작업

Prefetch

User.objects.prefetch_related(
	Prefetch(
    	'consultings'
        queryset=Consulting.objects.filter(status=1)
        to_attr='attr_consultings'
    )
)

Serializer

class UseSerializer(ModelSerializer):
	consulting_list = SerializerMethodField()
    
    def get_consultings(self, obj):
       	return obj.attr_consultings