TIL#159 serializer 상속

Dasom·2022년 4월 28일
0

Django

목록 보기
28/34

응답 코드와 응답 메세지를 새로 커스텀해서 쓰는 방식으로 하고 있는데,
시리얼라이저에서 return 값을 커스텀하면 views.py에서 serializer.data를 할때 시리얼라이저의 필드에 있는 값만 출력이 되고 커스텀한 값은 출력이 되질 않았다.
to_representation 함수를 이용해도 마찬가지였다.
그렇다고 모든 시리얼라이저에 응답 코드와 응답 메세지 필드를 일일히 다 쓰기엔 너무 지저분해 보이고 중복되기 때문에 고민을 시작했다.
그러던 중 한가지 생각이 떠올랐는데 사실 이 방법은 구글링에서도 못 본 방법이었는데 (내가 검색을 잘 못해서 일수도?!😅) 시리얼라이저를 추상화해서 상속받는 방법이었다..!
모델링할 때는 자주 사용하는데 시리얼라이저에서는 본 적도 해본 적도 없었지만 한 번 시도해보기로 했다😆

# configs/abstract.py

# 거의 모든 테이블에 들어가는 필드기 때문에 추상화시켜서 상속받아 사용
class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True
        ordering = ['-created_at', '-updated_at']


# 시리얼라이저도 같은 방식으로 도전해보기로 함!!
class BaseSerializer(serializers.Serializer):
    result_code = serializers.IntegerField(read_only=True, default=0)
    result_desc = serializers.CharField(max_length=64, read_only=True, default='')

    class Meta:
        abstract = True

이렇게 공통되는 추상화된 클래스를 따로 파일로 빼서 상속받는 방식으로 진행했다.

# users/serializers.py

from configs.abstract import BaseSerializer


# 추상화시킨 시리얼라이저 상속받음
class UserLoginSerializer(BaseSerializer):
    account = serializers.CharField(max_length=32, allow_null=True, allow_blank=True)
    name = serializers.CharField(max_length=32, read_only=True)
    password = serializers.CharField(write_only=True, allow_null=True, allow_blank=True)
    token = serializers.CharField(max_length=255, read_only=True)
    
    def validate(self, attrs):
        ....
        return user

views.py의 serializer.data 사용시 아주 잘 나오는 것을 확인할 수 있었다😄

{account: '', name: '', token: '', result_code: '', result_desc: ''}

profile
개발자꿈나무🌲

0개의 댓글