[DRF] serializer field옵션 | serializer에 필드 추가, 변경하기
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/