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 불가 - 미구현됨
참고 문헌
- https://django-ninja.rest-framework.com/guides/response/ // Defining a Schema
- https://django-ninja.rest-framework.com/guides/response/django-pydantic/ // Schmeas from django models
- https://django-ninja.rest-framework.com/guides/response/django-pydantic-create-schema/ // Generating a Schema Dynamically
'Python > Django Ninja' 카테고리의 다른 글
[Django Ninja] GIS 데이터 처리 관련 정리 (0) | 2023.05.24 |
---|---|
[Django Ninja] 정참조, 역참조 Schema 구현 (0) | 2023.04.29 |
[Django Ninja] 커스텀 Pagination 모듈 구현기 (0) | 2023.04.16 |
[Django Ninja] API Docs에서 Enum 드롭 다운 표시하기 (0) | 2023.04.09 |
[Django Ninja] Django Ninja 프레임워크란? (with. Boiler Plate) (0) | 2023.02.26 |