현제의 현재이야기
[OSOD] SerializerMethodField()에 대하여 본문
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 해줌
잘 뜹니다.
참고:
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")로 시리얼라이저에서 받아오는 로직인 것 같다.
시리얼라이저 어려워요
'DRF > OSOD' 카테고리의 다른 글
[OSOD] 구독 이메일 관련 (0) | 2023.02.19 |
---|---|
[OSOD] 비밀번호 변경 및 리셋 관련 (0) | 2023.02.16 |
[OSOD] Nested Serializer 및 views.py 작성 (0) | 2023.02.04 |
[OSOD] 회원가입 인증 이메일 (0) | 2023.01.29 |
[OSOD] dj-rest-auth custom + logout (0) | 2023.01.26 |
Comments