현제의 현재이야기

[OSOD] SerializerMethodField()에 대하여 본문

DRF/OSOD

[OSOD] SerializerMethodField()에 대하여

현재의 현제 2023. 2. 13. 22:52
dateDict = {0: '월요일', 1:'화요일', 2:'수요일', 3:'목요일', 4:'금요일', 5:'토요일', 6:'일요일'}

class SentenceSerializer(serializers.ModelSerializer):
    day_of_the_week = serializers.SerializerMethodField()
    
    class Meta:
        model = Sentence
        fields = ['id', 'sentence', 'discription', 'created_at', 'translate', 'day_of_the_week']

    def get_day_of_the_week(self, obj):
        created_at = obj.created_at
        day_of_the_week = dateDict[created_at.weekday()]
        return day_of_the_week

요일을 한국어로 표시해야하는 소요가 발생. 하지만 모델에 추가하여 views.py에 추가하게 되면 매우 지저분해짐.

그래서 serializer로 보낼 때 모델에 없는 필드를 보내주기 위해 SerializerMethodField()를 이용하였음.

  • SerializerMethodField()를 추가하고 fields에 추가
  • 함수 get_ ~ (self, obj): 추가하여 return 해줌

잘 뜹니다.

참고:

 

[Django]DRF SerializerMethodField() 란?

SerializerMethodFiled() 란? 연결되어 있는 serializer 클래스에서 메서드를 호출하여 값을 가져올 수 있는 읽기 전용 필드이다. 객체의 serializer 된 표현에 모든 종류의 데이터를 추가하는데 사용할 수 있

leffept.tistory.com

 

 

[python] 파이썬으로 날짜가 무슨 요일인지 구하기

파이썬으로 특정 날짜가 무슨 요일인지 구하는 방법입니다. 매우 쉽습니다! 일단 가지고 있는 날짜데이터가 문자열이라면 datetime형으로 변경해줍니다. 저는 오늘날짜인 2021년 10월 21일을 넣었어

domdom.tistory.com

class PostSerializer(serializers.ModelSerializer):
    user = UserDetailSerializer(read_only=True)
    bool_like = serializers.SerializerMethodField()

    class Meta:
        model = Post
        fields = ["id", "user", "body", "sentence", "like_num", "bool_like", "created_at"]

    def get_bool_like(self, obj):
        request = self.context.get("request")
        if obj.like_users.filter(pk=request.user.id).exists():
            return True
        return False
  • SerializerMethodField method would not work as expected. This is because the bool_like value is only set once in the list method of the PostOrderView, and is not tied to a specific Post instance. If you want to include the bool_like field for each Post instance in the serialized representation, you need to calculate the value for each Post instance separately in the SerializerMethodField method. 라고 한다. 그럼 day_of_the_week는 왜 된거지?
  • 그래서 get_queryset() 메소드에서 context를 보낼 때, 거기에서 request를 뽑아서 필터링을 해준다.
def get_serializer_context(self):
        """
        Extra context provided to the serializer class.
        """
        return {
            'request': self.request,
            'format': self.format_kwarg,
            'view': self
        }
        
def get_serializer(self, *args, **kwargs):
        """
        Return the serializer instance that should be used for validating and
        deserializing input, and for serializing output.
        """
        serializer_class = self.get_serializer_class()
        kwargs.setdefault('context', self.get_serializer_context())
        return serializer_class(*args, **kwargs)
  • 여기에서 self는 시리얼라이저를 사용하는 Post의 instance이고 이것은 시리얼라이저의 object 그 자체를 의미한다.
  • 그러면 obj는 무엇인가? obj는 serializer에 pass되는 Post의 인스턴스이다. 이것은 Post 모델의 하나의 인스턴스이다.
  • 위의 PostLikeAPIView의 경우에는 get_serialzier 메소드가 없기 때문에 serializer = LikeUsersSerializer(post, context={'request': request})로 시리얼라이저에 request를 보내고 request = self.context.get("request")로 시리얼라이저에서 받아오는 로직인 것 같다.

시리얼라이저 어려워요

Comments