AI 웹개발반/Python, Django

[DRF] serializer field옵션 | serializer에 필드 추가, 변경하기

째깍단 2023. 6. 22. 06:13

SerializerMethodField()

 

serializer 에서 사용할 수 있는 옵션 중 하나로,

해당 serilizer에 있는 field의 값을 변경해주거나 아예 없는 값을 추가하는데에도 사용할 수 있다.

 

 

 

예시 :

 

likes는 기존 모델에 있는 field이다.

likes_count 라는 수를 세어주는 함수와 serializerMethodFiedl를 사용해 없는 field를 추가하였다

 

 

class FeedDetailSerializer(serializers.ModelSerializer):
    """feed 상세 serializer"""

    likes_count = serializers.SerializerMethodField()
    likes = serializers.StringRelatedField(many=True)

    class Meta:
        model = Feed
        fields = ['likes', 'likes_count',]

    def get_likes_count(self, obj):
        return obj.likes.count()

 

 

 


 

 

 

StringRelatedField()

 

 

 

위의 예시에서도 보이는 다른 옵션 StringRelatedField.

기본적으로 FK로 받아온 field는 primary key 값으로 표시되지만,

 

 

 

 

 

 

primary key 값대신 value값을 보내기 위해 StringRelatedField를 사용할 수 있고

무조건 Read only임!!

** 해당 모델에 스트링 메서드를 정의하면 해당 field를 가져올 수 있다.

 

 

likes는 User 모델에서 다대다 관계를 가지고 있는 필드여서 적용이 가능하고

M2M인 경우 꼭! many=True 옵션을 주어야한다

 

class Feed(models.Model):
	...
	likes = models.ManyToManyField(
        "user.User", blank=True, default=[], related_name="feed_likes"
    )

 

 

가져오는 결과물

 

{
    'likes': [
        '1: 닉네임1',
        '2: 닉네임2',
        '3: 닉네임7',
        ...
    ]
}

 

 

 

 


 

 

 

 

PrimaryKeyRelatedField()

 

마찬가지로, pk로 연결하는 field도 있다!!

 

아래는 공식문서의 예시

옵션은 필요한 것을 사용하자

 

class AlbumSerializer(serializers.ModelSerializer):
    tracks = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ['album_name', 'artist', 'tracks']

 

아래와 같이 pk값만을 가져온다.

 

{
    'album_name': 'Undun',
    'artist': 'The Roots',
    'tracks': [
        89,
        90,
        91,
        ...
    ]
}

 

 

 


 

그외 관계를 표현하는 옵션

 

SlugRelatedField()

slug형태로 된 내용을 가져올 수 있다. str, int ...

write, read 둘다 가능한데, unique=True 옵션을 주어야함

 

hyperlinkedrelatedfield()

hyperlink 내용을 가져온다. (list형태)

write, read 둘다 가능

 

hyperlinkedIdentifyfield()

hyperlink로 내용을 가져온다 (단일)

읽기 전용

 

 

 

 

 

 

옵션 말고도 유익한 정보가 많으니 나머지 부분도 읽어보자!

 

[참고] : https://www.django-rest-framework.org/api-guide/relations/