Serializer
Serializer(=직렬화) : 데이터의 구조와 상태에 영향을 주지 않고 다른 환경에 저장하고 재구성이 가능한 포맷으로 변환하는 과정.
지금부터 파이썬에서 Class -> Dictionary -> JSON -> bytes로 직렬화를 해보려 한다.
Class -> Dictionary
python 3.7 버전부터 dataclass를 지원한다. @dataclass 데코레이터로 클래스를 작성한 후 dataclasses.asdict()로 직렬화가 가능하다. 장고에서는 이와 비슷하게 model_to_dict()를 제공한다. 하지만 ForeignKey나 OneToOneField로 매핑된 객체를 루프 모양의 참조 문제가 발생할 수 있기 때문에 직렬화하지는 않는다. 직렬화 모듈을 사용하기 위해서 DRF를 사용하자.
dictionary -> JSON
- JSON으로 표현 가능한 데이터 타입 : string, number, object, array, boolean, null
- 날짜 정보는 문자열로 인코딩을 통해 변환해줘야 한다.
- 장고는 JSON 인코더를 제공한다.
- DRF로 직렬화를 할 때 Serializer와 Render라는 모듈을 제공하며 장고 Ninja는 pydantic으로 직렬화를 관리한다. DRF Serializer는 클래스를 딕셔너리로, Render는 딕셔너리를 JSON으로 변환한다.
ModelSerializer
class TestSerializer(serializers.ModelSerializer):
class Meta:
model = Test
fields = (...)
# 참고로 모든 필드를 직렬화하는 경우 다음 처럼 쉽게 작성할 수 있다. fields = "__all__"
depth = 1 # depth 옵션을 통해 참조하는 경우 참조하는 키 값이 아니라 객체 정보를 담아올 수 있다. + depth 옵션은 한계점이 존재하는데 직렬화 대상에서 제외를 못 한다. 이럴 때에는 직접 직렬화해야 한다.
many 옵션
- 1:N 관계에서 many=True 옵션을 부여해야 한다.
is_valid
- Serializer 하위 모든 validation 로직을 수행하는 method
- validate_필드명 으로 method를 선언하면 DRF가 자동으로 인식하고 유효성 검증 시 해당 method를 함께 수행한다.
create(), update()
- Serializer는 create(), update() 메서드를 구현해서 사용할 수 있다.
- save() method를 호출할 때 DB에 인스턴스가 존재하지 않을 경우 create method를 호출하고, 존재할 경우 update method를 호출한다.
- is_valid() method가 수행되면 validated_data를 생성하고 create(), update() method에서 사용 가능.
drf-spectacular
- DRF에서 API 문서를 자동으로 만들어주는 라이브러리로 OpenAPI Spec(OAS) 3.0을 지원한다.
pip install drf-spectacular
설치 후 앱 등록하고 url도 등록하자.참조