수학과의 좌충우돌 프로그래밍

[Django] Serializer Custom Field, SerializerMethodField 본문

웹프로그래밍/DRF

[Django] Serializer Custom Field, SerializerMethodField

ssung.k 2020. 2. 26. 15:14

django rest framework 를 사용하여 rest API 서버를 만들다보면 serializer 를 사용하지 않을 수 가 없습니다.

기본적으로 model 에 등록된 필드 값들은 Meta 클래스에 추가줌으로서 다뤄줄 수 있지만 커스텀 필드를 정의하는데 있어서는 새로운 방법이 필요합니다.

이번 포스팅에서는 간단하게 Custom Field 만드는 법에 대해서 알아보도록 하겠습니다.

SerializerMethodField

SerializerMethodField 를 사용하여 쉽게 커스텀 할 수 있습니다.

SerializerMethodFieldread-only field 로 값을 저장하거나 수정할 때는 사용되지 않고 조회할 때만 사용합니다.

인자로는 method_name 로 해당 필드값에 대해 정의하는 함수의 이름을 넘겨줍니다.

지정해주지 않을 경우 default 로는 get_<field_name> 로 지정해줄 수 있습니다.

 

예시를 통해 살펴보겠습니다.

# serializers.py

from rest_framework import serializers as sz

class ReviewSerializer(sz.ModelSerializer):
    class Meta:
        model = Review
        fields = (
            'profile',
            'content',
            'created_at'
        )

댓글에 대한 ReviewSerializer 를 정의하였습니다.

fields 로는 작성자, 내용, 작성날짜를 지정해주었습니다.

이 때 Review 모델은 Profile 모델과 ForeignKey로 연결되어 있습니다.

따라서 profile의 id 값이 저장되어 있기 때문에 해당 serializer 로 데이터를 조회해도 id 값이 조회됩니다.

따라서 id 값으로 사용자의 이름을 추가적으로 불러와야 하는 문제가 생깁니다.

 

따라서 SerializerMethodField 를 통해서 이를 커스텀 하도록 하겠습니다.

# serializers.py

from rest_framework import serializers as sz

class ReviewSerializer(sz.ModelSerializer):
    username = sz.SerializerMethodField()
    
    def get_username(self, obj):
        return obj.profile.nickname
      
    class Meta:
        model = Review
        fields = (
            'username',
            'profile',
            'content',
            'created_at'
        )

get_username 을 통해 username의 값을 지정해주며 obj 으로는 해당 모델의 obj이 들어오게 됩니다.

마지막으로 fields 에 명시해주면 해당 필드도 serializer 조회 시 return하게 됩니다.

Comments