SW개발/Django

[Django]DRF SerializerMethodField() 란?

SerializerMethodFiled() 란?

연결되어 있는 serializer 클래스에서 메서드를 호출하여 값을 가져올 수 있는 읽기 전용 필드이다.

객체의 serializer 된 표현에 모든 종류의 데이터를 추가하는데 사용할 수 있다.

 

언제 사용해야 하나요?

객체를 serializer 할 때 모델에 없는 필드를 추가하고 싶거나, 모델에 있는 값을 변형해서 새로운 필드의 값으로 넣고 싶을 때

SerializerMethodField()를 사용하면 된다.

 

어떻게 사용해야 하나요?

User 객체의 모델에는 full_name 필드만 있다고 가정하자.

# Serializer된 User 객체
"id" : 1,
"full_name" : '{"first_name": "Yoon", "last_name": "Jun Ki"}',

이 상황에서 last_name에 대한 정보를 serializer에 추가하여 아래와 같이 만들고 싶은 경우가 있을 것이다.

# last_name을 추가한 Serializer된 User 객체
"id" : 1,
"full_name" : '{"first_name": "Yoon", "last_name": "Jun Ki"}',
"last_name" : "Jun Ki",

모델에서 Meta 클래스를 지정하여 last_name을 추가해보는 방법도 생각해볼 수 있지만, 모델에는 last_name 필드가 존재하지 않기 때문에

이 방법으로는 위처럼 만들 수 없다.

 

이 때, SerializerMethodField()를 사용하여 last_name 필드를 추가함으로써 해결할 수 있다. 이를 위해서 단 2가지의 작업만 수행하면 된다.

  1. Serializer에 SerializerMethodField()로 모델에 존재하지 않는 필드 추가
  2. Serializer에 Method 추가 (객체의 값을 변형해서 넣기 위함
SerializerMethodField() 작성
Class UserSerializer(serializers.Serializer):
    full_name = JSONField
    first_name = serializers.SerializerMethodField('get_first_name')
	
    def get_first_name(self, obj): # 객체를 인자로 받음
    	return obj.full_name['first_name'] # 유저 객체의 full_name 속성에서 first_name 추출

다음과 같은 코드를 작성함으로써 모델에 존재하지 않는 필드를 Serializer의 필드에 추가할 수 있게 되었다.

 

728x90