본문 바로가기
IT CHANNEL/Python

[DRF 게시판만들기] #3 Serializer, ModelSerializer 개념 및 역할

by TitanX 2022. 3. 20.
목차

1. Serializer

 

2. ModelSerializer

 

3. Serializer 의 필요성과 역할

 

Serializer

 

  • 먼저 게시판앱 "board" 에 "serializers.py"를 생성합니다.
    django와 프레임워크 설치시 자동으로 생성되지 않습니다. 

  • 다른 app도 마찬가지로 생성합니다.

  • serializers에는 아래처럼 "직렬화"를 위한 코드들이 작성됩니다.
    우선, 코드를 통해 어떻게 작성되는지 살펴보면 역할에 대해서 알게 될 것 입니다.

 

 

 

 

  • Serializer는 BaseSerializer를 상속받아서 보편적으로 사용되는 Serializer입니다. 사용할 데이터에 따라서 필드값을 하나씩 지정해줍니다. Charfield가 대부분의 데이터를 받아줄 수 있지만, 가능하면 모델과 타입을 맞춰주는 것이 좋습니다.
class PostSerializer(serializers.Serializer):
    id = serializers.IntegerField(help_text="게시글id", read_only=True)
    user = serializers.CharField(help_text="유저")
    category = serializers.CharField(help_text='카테고리')
    title = serializers.CharField(help_text='제목', allow_null=True)
    content = serializers.CharField(help_text='내용', allow_null=True)

    def create(self, validated_data):
        return Post.objects.create(**validated_data)
  • 이때 필드옵션으로 allow_null, read_only, write_only, help_text 등이 빈번하게 사용됩니다.

 

ModelSerializer

  • ModelSerializer는 Meta 클래스에서 사용할 모델을 명시해줍니다. 이렇게 되면, Post 모델을 사용하는 serializer가 됩니다. 필드를 일일히 하나씩 입력할 필요없이, 받아올 데이터의 모델을 지정하여 ‘all’ 로 전부 받아올 수 있습니다.
class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post
        fields = '__all__'

하지만 이렇게 all로 전부 받아오게 되면, 추상적인 필드값으로 내용이 헷갈릴 수 있습니다.

걷보기엔 바로 인지 하기 힘들지만, 지금 상속받는 필드(user, category 등)는 ‘_id’ 값으로 받아옵니다.

  • 작성자를 예를 들면 "user": 1 로 받아오게 됩니다.
  • user 모델을 보면 이렇게 되어있습니다.
class User(models.Model):
    email = models.EmailField(verbose_name='이메일', unique=True)
    nickname = models.CharField(verbose_name='닉네임', max_length=8, null=False, unique=True)
    first_name = models.CharField(verbose_name='이름', max_length=5, null=False)
    last_name = models.CharField(verbose_name='성', max_length=5, null=False)
    phone = models.CharField(verbose_name='휴대폰', max_length=11, null=True, blank=True)

    class Meta:
        verbose_name = '유저'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.email

 

이 때 user의 필드를 따로 정의해서 원하는 값으로 받겠습니다.

ForeignKey로 받기 때문에 이럴 때는 StringRelatedField()를 사용하면 됩니다.

이 필드는 상속받는 모델의 str 메소드로 return 되는 값을 받아옵니다.

class PostSerializer(serializers.ModelSerializer):
    user = serializers.StringRelatedField() # __str__ 리턴 값 받아옴

    class Meta:
        model = Post
        fields = '__all__'
  • 그 결과로 user의 email을 가져오게 됩니다.
    • "user": "[test@test.com]"

일부 필드만 지정하려 한다면 field = ( ), 일부 필드를 제외하고 싶다면 exclude=( ) 을 사용하면 됩니다.

read_only 옵션이 들어간 필드라면 read_only_fields = ( ) 가 있습니다.

  • StringRelatedField는 모델에서 상속받아 사용하는 field를 위한 것 입니다. 상속해주는 모델의 ‘str’ 메소드로 return 되는 값을 받아서 보내주는 역할을 합니다.

 

Serializer 의 필요성과 역할

DRF 의 serializer에 대한 공식문서 : Serializers

이제 django_rest_framework를 통해서 restful 한 API 를 만들수 있습니다.

이 API 를 이용해서 프론트엔드 웹, 앱등에 데이터를 보내줍니다.

 

그 과정에서 데이터를 주고받는 방식이 불규칙하고 명세가 나와있는 방식이 아니라면, 이 데이터를 사용하고 보여주는 입장(프론트/클라이언트)은 난해할 수 밖에 없습니다.

이 때 데이터를 직렬화해서 백엔드에서 데이터를 처리해서 보내줄 수 있습니다.

 

 

여러구조로 데이터를 보내는 것 보다, 사전과 리스트로 구성된 데이터로 정형화 되어보내지게 되면 사용성이 보장될 것입니다.

이렇게 serializer를 통해 형태로 wrapping 해서 view로 보내줍니다.

 

view와 serializer는 매우 밀접한 관계가 있습니다.

어떤 view를 사용할 것인가에 대한 고민은 데이터 아키텍쳐에 대한 퀄리티를 반영하는 것 같습니다.

우선 serializer를 사용해보고 view를 어떻게 사용하는지 이어서 이해하는 것이 적절하다고 생각합니다.