2024. 12. 17. 07:02ㆍWeb programming/Django
DRF의 직렬화 모듈인 DRF Serializer는 내부에서 수행하는 역할이 많다. 구현할 때 책임을 잘 분리해야 하고 내부에서 수행하는 역할이 많은 만큼 디버깅도 까다롭다.
직렬화란? 데이터의 구조와 상태를 해치지 않고 다른 컴퓨팅 환경에 저장하고 재구성이 가능한 포맷으로 변환하는 과정
파이썬으로 데이터 구조를 표현하면 작성된 데이터가 너무 크기 때문에 네트워크 통신을 사용해 전송하는 것도 비효율적이고 다른 언어도 데이터 구조를 이해하지 못하기 때문에 데이터 구조를 표현하는 통일된 규칙인 json 데이터 표현 방식을 사용, 모든 언어가 json이라는 데이터 구조를 각 언어의 클래스로 변환해주는 라이브러리 지원하거나 언어 자체에서 json 지원
이때 데이터를 저급하게 변환하는 과정을 직렬화라고 부른다.
class -> dic -> json -> bytes
DRF
모델을 딕셔너리로 직렬화하는 장고의 모듈은 ForeignKey() OneToOneField()로 매핑된 객체를 직렬화해주지 못한다. 이렇게 빈약한 직렬화 모듈을 보완하고 장고를 확장시킨 프레임워크가 DRF이다.
- DRF는 장고의 JSON 인코더보다 더 강력한 DRF JSON 인코더를 구현해 놓았다.
DRF serialization
- 기능 : 데이터 직렬화, 데이터 검증, 데이터 저장, API 스키마 모델링
- 일반적인 프레임워크에서 render가 파이썬 데이터 타입을 JSON포맷으로 변환하는 역할도 담당하지만 DRF는 데이터 타입을 변환하는 역할을 Serializer에게 위임해서 Render가 하는 일이 줄어들었다. 덕분에 Serializer 모듈 위에서 직렬화와 관련된 모든 작업을 수행할 수 있게 되었다.
drf serializer : class -> dict
drf render : dict -> json
DRF serialization의 데이터 직렬화 기능
- 직렬화를 하기 위해서 데이터 타입을 맞춰주는 작업이 가장 중요하다.
( JSON 으로 표현 가능한 데이터 타입은 string number object array boolean null 인데 파이썬의 데이터 타입에 매칭할 수 있는 JSON 데이터 타입이없어서 )
json 데이터를 파이썬으로 가져올 때 DRF serialization 모듈로 데이터 타입을 명확히 선언해줘야 한다.
ModelSerializer을 상속 받아 일일이 필드 타입을 선언해주는 것을 해결할 수 있다.
매번 모든 Serializer를 선언할 때마다 일일이 필드 타입을 선언해주는 문제 해결하기 위해 아래 제공
serializers.ModelSerializer
serializers.Serializer
- serializers.ModelSerializer에서 Meta.depth
중첩된 관계(nested relationships)를 직렬화할 때의 깊이(depth)를 설정하는 데 사용
- Meta.depth는 모델의 관계 필드(ForeignKey, OneToOneField, ManyToManyField)를 얼마나 깊게 직렬화할지를 결정
- 기본적으로 ModelSerializer는 관계 필드에 대해 기본 키(예: id)만 포함하지만, depth를 설정하면 관계된 모델의 필드들을 포함하여 직렬화
from rest_framework import serializers
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
depth = 1
{
"id": 1,
"title": "Harry Potter",
"author": {
"id": 1,
"name": "J.K. Rowling"
}
}
cf ) depth=0일 때
{
"id": 1,
"title": "Harry Potter",
"author": 1
}
- many=True
'Web programming > Django' 카테고리의 다른 글
PDM으로 Django 가상환경 설정부터 서버 실행까지 - pip과 비교 (Mac, VSCode) (0) | 2024.11.26 |
---|---|
Django MTV (0) | 2022.11.26 |