Python (with. Code)/Django-ninja

[Django Ninja] Schema 비교 (Schema, ModelSchema, CreateSchema)

yubi5050 2023. 2. 27. 23:58

Schema

Schema란 어떤 데이터나 객체를 정의한 규칙으로 주고 받는 것을 의미한다.

다른 언어, 프레임워크에서는 DTO (Data Transfer Object) 라는 용어로도 많이 사용된다.

 

FastAPI vs Django Ninja 스키마 방식 차이

ex) FastAPI에서 Schema 는 Pydantic을 이용해 정의된다. 

ex) Django Ninja의 Schema는 Pydantic을 상속 받아 작성 된 방식으로 자체적으로 만든 Schema라는 모듈로 정의됨

 

공식 Document 에서 제공하는 3가지 Schema를 만드는 방식에 대해 알아본다.

 

1. Schema

2. ModelSchmea

3. CreateSchema

 

Schema

가장 기본적인 Schema 형태로 DRF의 Serializer와 유사하다.

  • model에서 선언한 id, title 등 field를 선언해주어하며,
  • 만약 validation을 하고 싶다면 resolve_<필드이름>을 통해 추가적인 검증이나 가공을 할 수 있다.
from ninja import Schema

class TaskSchemaValidOut(Schema):
    id: int
    title: str

    @staticmethod
    def resolve_title(obj):
        return 'test+' + obj.title

 

ModelSchema

Model 기반의 Schema 형태로 DRF의 ModelSerializer와 유사하다.

  • model의 Field를 일일이 재선언할 필요 없이 바로 __all__, model_fields, model_exclude 등으로 사용 가능하다.
  • 특정 필드만 가져오거나, 외래키 등의 관계도 가져올 수 있다.
  • 똑같이 만약 validation을 하고 싶다면 resolve_<필드이름>을 통해 추가적인 검증이나 가공을 할 수 있다.
from ninja import Schema

class CategorySchema(ModelSchema):
    class Config:
        model = Category
        model_fields = ['id', 'type']
        
class TaskSchemaOut(ModelSchema):
    category: CategorySchema # 외래키 관계의 필드 가져오기
    class Config:
        model = Task
        model_fields = "__all__"
        # model_fields = ['title', 'category'] # 특정 필드만
        # model_exclude = ['id', ] # 특정 필드 제외

    @staticmethod
    def resolve_title(obj):
        return 'test_' + obj.title

 

 

CreateSchema

자유롭게 Schema를 만들 수 있는 방법으로, 선언보다는 함수로 객체를 구현하여 반환하는 느낌이다.

  • model의 객체와 Field를 간단히 적어주고, create_schema 함수의 인자로 넣어주면 schema 객체가 반환된다.
  • 특정 필드만 가져오거나, 외래키 등의 관계도 가져올 수 있다. (depth =1) 
  • Create Schema에서 resolve_<필드명>과 같은 Validator는 해당 소스 코드로 보아 아직 미구현 된 것으로 보인다.
from ninja.orm import create_schema

TaskSchemaOut = create_schema(
    Task,
    fields=['id', 'title', 'category'],
    # exclude=['id'], # 'title','category'
    depth=1 # for category
)

# Validator 불가 - 미구현됨

 

참고 문헌