본문 바로가기
코딩공부/Django

DRF SerializerMethodField()로 모델 필드 변형하여 활용하기

by Dong_Devlog 2022. 12. 8.

SerializerMethodField()

시리얼라이저로 객체를 직렬화 할 때, SerializerMethodField()를 활용하면 필드 값을 입맛에 맞게 가공할 수 있다.

 

예를 들어, Post라는 모델에 likes라는 ManyToManyField를 아래와 같이 만들어주었다면 DB에는 어떤 post에 누가 좋아요를 눌렀는지 확인할 수 있다. 하지만 어떤 post에 좋아요를 몇 명이 눌렀는지에 대한 정보는 없다.

# models.py
class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    ...
    likes = models.ManyToManyField(User, related_name='like_posts')

 

SerializerMethodField() 사용하기

이런 경우 시리얼라이저로 객체를 직렬화 할 때, likes라는 필드를 변형해주면 시리얼라이저에 원하는 정보를 담을 수 있게 된다. 아래와 같이 likes_count = serializers.SerializerMethodField()를 사용해준다면 likes_count에 좋아요를 누른 user 수를 담을 수 있다.

# serializers.py
class postlikeSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()
    likes_count = serializers.SerializerMethodField()
    
    def get_likes_count(self, obj):
        return obj.likes.count()
        
    class Meta:
        model = Post
        fields = ('user', 'likes_count')

 

 위에서는 method_name 값을 지정해주지 않았기 때문에 get_이 붙게 되어 get_likes_count로 필드네임이 지정 되지만, method_name을 지정해서 사용할 수도 있습니다. SerializerMethodField(method_name='likes_count')

    likes_count = serializers.SerializerMethodField(method_name='likes_count')
    
    def likes_count(self, obj):
        return obj.likes.count()

 

댓글