Serializer 필드 작성 방법

Marco Kang·2021년 1월 22일
7

DRF

목록 보기
2/2
post-thumbnail
post-custom-banner

Serializer에서는 Django Model의 데이터를 직렬화 시키기 때문에 그에 맞게 필드 조정을 할 필요가 있음.
크게 나누면
읽기만 해야하는 필드(read_only), 쓰기만 해야하는 필드(write_only), 둘 다 해야하는 필드로 나눌 수 있음.
그리고 모델에 있는 필드, 새로 정의해야하는 필드가 있음.

1. W, R 다 해야 하는 필드
입력도 하고 입력한 그대로 출력할 수 있는 필드는 기본적으로 Model에 쓴 필드 그대로 사용이 가능해서 Serializer에 아무것도 넣지 않아도 됨. 사실 이게 제일 좋다. 아무것도 안 해도 되니까.

2. 쓰기만 해야하는 필드.
모델에는 없으나 api에서 입력은 넘겨야 하는 필드. (보통 쓰기만 해야하는 필드는 모델에 정의할 일이 없거나 password처럼 기존에 AbstractUser 같은 곳에 이미 기본적으로 정의가 되어 있음)
password가 대표적이고, 다른 ForeignKey 필드의 아이디 같은 것)는 Serializer 상에서 새로 필드를 정의한다.
예를 들면

password = serializers.CharField(write_only = True)

그냥 CharField()로 정의하고 class Meta에서 write_only_fields에 Write Only 할 필드를 몰아넣으면 되는 건 줄 알았는데 그건 안 된다. Serializer 상에서 정의한 필드의 write only는 반드시 필드의 괄호 안에 write_only=True로 선언해야 먹힌다.

3.읽기만 하는 필드
읽기만 하는 필드의 경우 Serializer상에서 정의하는 필드냐, 모델에 있는 필드냐에 따라 정의하는 방법이 달라진다.

내가 Django를 공부한 Nomadcoders의 Airbnb-clone 같은데에서 보면 Room이 ForeignKey로 User를 가지는데, 이 경우 user의 이름이라든가 Superhost인지 아닌지에 대한 출력을 api에서 해줄 것이다.
(1)
실제로 ForeignKey로 가지는 User에는 이름이나 Superhost 여부의 정보 외에도 수많은 정보들이 있겠지만 api에서 그것을 다 가져오는 것은 낭비고 필요한 필드만 쏙 가져와서 쓸 수 있다.

username = serializers.ReadOnlyField(source='user.username')
is_superhost = serializers.ReadOnlyField(
		source='user.is_superhost')

이런 식으로, 필드를 이미 ReadOnly 필드로 정의하기에 Char인지 Text인지 그런건 신경쓸 필요가 없고 소스를 Room 기준으로 user필드의 username과 is_superhost를 가져오기 위해서 저런 식으로 source를 적어준다.
반대로 Model에 정의한 필드인데 그 중에 api로 GET만 하고 POST나 PUT은 하지 않을 필드의 경우엔 Meta클래스에서 read_only_fields로 정의한다.

class RoomSerializer(serializers.ModelSerializer):
    class Meta:
        model = Room
        read_only_fields = ('id',)

이렇게 할 경우 id 값은 읽어오기만 가능하고 새로 만들거나 수정하는 것은 불가능하다.

정리)
1.W,R 다 하는 필드는 모델에만 정의하면 끝.
2.W만 할 필드는 Serializer 상에 새로 정의할 때는 필드 안에 write_only=True
3.R만 할 필드는 serializer에서 정의하는 필드는 serializers.ReadOnlyField(source='필드명.필드명') (이렇게 쓰는 이유는 어차피 이렇게 선언하는 게 ForeignKey 오브젝트 중에서 특정 필드만 끌어올 때 뺴곤 잘 없기 때문.
Model에 있는 필드는 class Meta 안에 read_only_fields=('필드명1','필드명2')

profile
데이터 사이언티스트를 향해.
post-custom-banner

1개의 댓글

comment-user-thumbnail
2021년 3월 12일

너무 좋은 글이네요. 정리해주셔서 감사합니다.

답글 달기