Serilaizer

data_hamster·2023년 4월 26일
0

학습주제
시리얼라이저(Serilaizer)와 뷰(Views)

학습내용
django-venv 가상환경을 켜준 상태에서
python -m pip install djangorestframework

django rest framework을 설치해준다. 혹시 몰라서 기본 파이썬도 설치했다.

가상환경은 별도로 설치해줘야 한다.

Serializers: Django REST framework에서 등장하는 프레임워크

Serialize

https://velog.io/@kjyeon1101/DRF-Serializer%EA%B0%80-%EB%AD%98%EA%B9%8C

  • 모델 인스턴스나 QuerySet과 같은 데이터를 API로 주고 받기 위해서 JSON 같은 형식으로 변환하는 작업.

Deserialize

  • JSON 같은 형식의 데이터를 다시 모델과 같이 정의된 포멧에 맞춰 컴퓨터에 로딩하는 과정.

Serializer

이러한 변환과정을 담당하는 매개체로써, 모델에 있는 데이터를 JSON 데이터로 변환하고, 반대로 JSON 데이터를 모델로 변환하는 과정을 모두 가지고 있다. 일반적으로 API 서버에서는 JSON 타입으로 데이터를 주고받는다.

이번에 이러한 serialize와 deserialize를 기존 모델을 가지고 해보고, 결과를 장고 쉘을 통해 확인해본다.

우선 기존 mysite 폴더 내에서 Django rest framework의 기능을 구현할 새로운 앱을 생성한다.
python manage.py startapp polls_api
polls의 기능을 API로 구현할 예정이므로, 앱 이름은 polls_api라고 한다.

polls_api폴더 내에 serializers.py 파일을 생성한다.

from rest_framework import serializers
from polls.models import Question

Question을 Serialize 하는 클래스를 생성한다. serializers.Serializer를 상속한다.
class QuestionSerializer(serializers.Serializer):

Question 내의 필드들을 매칭시켜주는 작업이 필요함. 빼먹게 되면 해당 필드는 시리얼라이즈가 되지 않음. Question의 필드에는

question_text, pub_date와 자동으로 생성되는 id필드가 있다.
이제 세가지 필드를 시리얼라이저 내에서 하나하나 매칭시켜 준다.

id 필드는 serializers.IntegerField로 만들어 준다. 그 이유는 원래의 id필드는 정수로 구성되어 있기 때문이다. 아이디는 바꿀 수 없는 고유한 내용이기에 read_only=True 로 한다.
id = serializers.IntegerField(read_only=True)

question_text 필드는 다음과 같이 정의한다.
question_text = serializers.CharField(max_length=200)

pub_date는 다음과 같이 정의한다. models.py에서 생성시 auto_now_add=True로 자동으로 생성되었기에 read_only=True설정을 한다.
pub_date = serializers.DateTimeField(read_only=True)

필드의 정의가 끝났다. 다음은 create, update 메소드를 구현해본다.

create는 JSON으로 부터 받은 정보를 저장할 때 사용.
시리얼라이저는 생성을 할 때 유효성 검사를 통과한 데이터만 저장을 함. 통과한 데이터는 validated_data로 주어짐. 예를들어 question_textmax_length=200조건을 만족하는 데이터만 넘겨준다.

    def create(self, validated_data):
        return Question.objects.create(**validated_data)

validated_data를 기반으로 Question 오브젝트를 만들어준다 저 * 딕셔너리의 값을 전달해준다. key는 전달 X. 만일 키도 전달하고 싶으면
`.create(
validated_data.items())` 형식으로 전달해야 함.

update 메소드는 기존에 있던 값의 변경이 일어난다. 따라서 create 메소드에 추가로 instance를 추가한다.

    def update(self, instance, validated_data):
        instance.question_text = validated_data.get('question_text', instance.question_text)
        instance.save()
        return instance

validated_data는 딕셔너리 형식이므로 get으로 가지고 온다. 만일 값이 없을 경우, 기존 값인 instance.question_text를 넣어준다.
id, pub_date는 둘다 read_only이므로 수정하지 않는다.
메모리에 변경된 인스턴스 값을 저장해주고,
인스턴스를 반환하는 것으로 종료한다.

profile
반갑습니다 햄스터 좋아합니다

0개의 댓글