학습주제
시리얼라이저(Serilaizer)와 뷰(Views)
학습내용
django-venv 가상환경을 켜준 상태에서
python -m pip install djangorestframework
django rest framework을 설치해준다. 혹시 몰라서 기본 파이썬도 설치했다.
가상환경은 별도로 설치해줘야 한다.
Serializers: Django REST framework에서 등장하는 프레임워크
https://velog.io/@kjyeon1101/DRF-Serializer%EA%B0%80-%EB%AD%98%EA%B9%8C
이러한 변환과정을 담당하는 매개체로써, 모델에 있는 데이터를 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_text
의 max_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이므로 수정하지 않는다.
메모리에 변경된 인스턴스 값을 저장해주고,
인스턴스를 반환하는 것으로 종료한다.