DRF

OneDayDev·2024년 2월 13일
0

Django

목록 보기
14/14

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

  • DRF에서 제공
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도 등록하자.참조

profile
안녕하세요.

0개의 댓글