DRF 시작
Django Rest Framework 를 시작하면서 중요한 내용인
Serializer를 한번 짚어보고 넘어가자!
과연 Serializer는 무엇일까?
Serializer란? (직렬화?)
직렬화를 하는 직렬변환기?
모델 인스턴스, 쿼리셋 등의 complex type을 JSON, XML등의 content 타입으로 쉽게 변환 가능한 python 데이터형식으로 변환
Serializer는 우리가 Django 에서 사용하는 파이썬 객체나 queryset 같은 복잡한 객체들을 REST API에서 사용할 json 과 같은 형태로 변환해주는 역할을 한다.
Deserialize
받은 데이터(크롤링시 parse사용>python datatype)를 validating 한 후에 parsed data를 complex type으로 다시 변환
이때는 반드시 is_valid()를 호출하여 검사해야한다.
Serializer 클래스
REST API를 제공하는 장고 애플리케이션은 API를 요청한 애플리케이션과 JSON 데이터를 주고받을 수 있어야 한다. 이를 위해서는 DB 인스턴스를 JSON 데이터로 시리얼라이즈 하거나, 반대로 JSON 데이터를 DB 인스턴스로 디시리얼라이즈 할 수 있어야 한다. 이러한 목적으로 DRF가 제공하는 클래스가 바로 Serializer이며(장고의 Form 클래스와 유사), 이를 상속하여 특정 모델에 대응하는 시리얼라이저를 정의하게 된다. 이러한 시리얼라이저를 이용하면 DB 인스턴스를 JSON 데이터로 표현할 수 있고, JSON 데이터를 바탕으로 DB 인스턴스를 생성하거나 수정할 수 있다.
시리얼라이저에는 시리얼라이즈/디시리얼라이즈 되어야 하는 모델의 필드들이 정의된다. 대응하는 모델의 모든 필드들을 정의할 수도 있고, 일부 필드만 정의할 수도 있다. 여기에서 정의되는 필드의 값들은 시리얼라이즈 시 JSON 데이터로 표현할 때 사용이 되며, 디시리얼라이즈 시 DB 인스턴스를 생성하거나 수정할 때 사용이 된다. 그리고 각 필드에 명시되는 required, max_length, default 등의 유효성 플래그(Validation Flag)들은 디시리얼라이즈 시 해당 필드의 유효성이 어떻게 검사 되어야 하는지를 나타낸다. 더불어서, 어떤 플래그들은 HTML에 렌더링 할 때와 같이 특정한 상황에서 해당 시리얼라이저가 어떻게 디스플레이되어야 하는지 지정할 수도 있다(EX. style). 이는 Browsable API가 화면에 디스플레이되는 방식을 지정하고자 할 때 매우 유용하게 쓰인다.
그리고 시리얼라이저에는 create() 메소드와 update() 메소드를 정의해줘야 한다.
create() 메소드는 시리얼라이저를 대상으로 save() 메소드를 호출함으로써 DB 인스턴스를 생성하고자 할 때의 동작을 정의해야 하고, update() 메소드는 시리얼라이저를 대상으로 save() 메소드를 호출함으로써 DB 인스턴스를 수정하고자 할 때의 동작을 정의해야 한다.
ModelSerializer 클래스
장고가 Form 클래스에 대응하는 ModelForm 클래스를 제공하는 것과 마찬가지로, DRF도 Serializer 클래스에 대응하는 ModelSerializer 클래스를 제공한다. ModelSerializer는 특별한 것이 아니다. 그저 시리얼라이저를 더욱 편하게 정의할 수 있도록 리팩토링을 해줄 뿐이다. ModelSerializer 클래스가 제공하는 대표적인 기능은 다음과 같이 두 가지이다.
시리얼라이즈/디시리얼라이즈 되어야 하는 모델 필드들을 자동으로 정의해준다. 따라서 정의할 모델의 필드명만 명시해주면 그것들의 타입에 맞게 시리얼라이저의 필드들이 자동으로 정의가 된다.
create() 메소드와 update() 메소드를 가장 기본적인 형태로 이미 구현해 놓았다. 따라서 특별한 세부 구현이 필요하지 않은 경우에는 굳이 두 메소드를 정의해줄 필요가 없다. 세부 구현이 필요한 경우에는 오버라이딩을 하면 된다.
'Sparta Coding Club > Today I Learned [TIL]' 카테고리의 다른 글
[TIL] #DAY - 038 - related_name = [classname]_set(내일배움캠프AI 3기) (0) | 2022.10.28 |
---|---|
[TIL] #DAY - 037 - onclick? = location.href & location.replace! (내일배움캠프AI 3기) (0) | 2022.10.27 |
[TIL] #DAY - 035 - 카테고리별 게시글 갯수 구현! (내일배움캠프AI 3기) (0) | 2022.10.23 |
[TIL] #DAY - 034 - 프로젝트 구현 기능! (내일배움캠프AI 3기) (0) | 2022.10.21 |