SerializerMethodField()란?
연결되어 있는 serializer 클래스에서 메서드를 호출하여 값을 가져올 수 있는 읽기 전용 필드
객체의 serializer 된 표현에 모든 종류의 데이터를 추가하는데 사용 가능함
언제 사용해야 하나?
객체를 serializer 할 때 모델에 없는 필드를 추가하고 싶거나, 모델에 있는 값을 변형해서 새로운 필드의 값으로 넣고 싶을 때 사용 가능하다.
어떻게 사용해야 하나?
# 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 필드가 존재하지 않아 Meta 클래스 방법으로는 만들 수 없다.
이 경우, SerializerMethodField()를 사용해 last_name 필드를 추가함으로써 해결 가능하다. 이처럼 하기 위해서는 2가지의 작업을 수행해주면 된다.
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의 필드에 추가가 가능하게 할 수 있다.