Django ninja api 를 쓰려고 하면 항상 Querystring 으로 받아야할 경우가 많이 있다. 매번 따로 정의해서 쓰는 것 보다 공통적인 것은 Schema로 정의해서 쓰고 싶은데, 어떤 때는 값이 있을 때도 있고, 없을 때도 있으니 이 경우를 다 처리하는게 복잡해 보였는데 Schema 와 ninja.Query() 함수로 좀 쉽게 구현해 보자.
Django-ninja 공식 사이트에는 이와 관련된 아래와 같은 튜토리얼이 있다. 이를 잘 이해하면 끝!
https://django-ninja.rest-framework.com/tutorial/query-params/#using-schema
You can also use Schema to encapsulate GET parameters:
import datetime
from typing import List
from pydantic import Field
from ninja import Query, Schema
class Filters(Schema):
limit: int = 100
offset: int = None
query: str = None
category__in: List[str] = Field(None, alias="categories")
@api.get("/filter")
def events(request, filters: Filters = Query(...)):
return {"filters": filters.dict()}
여기에 포인트는
class Filters(Schema) 로 Query string or query parameters 로 받을 부분을 추상화 했다는 것이다.
여기에 초기 값은 해당 값이 쿼리스트링으로 넘어오지 않아도 이값이 사용된다는 것이다. 즉, 안 넣어줘도 기본 값을 줄 수 있다는 얘기
그다음은 api 함수가 이것을 어떻게 받아 들이느냐?
filters: Filters = Query(...)
이 형태로 = Query(...) 이렇게 명시해 줘야 한다.
이렇게 해줘야 막 나열되어서 들어오는 query string 중에 필드명이 맞는 것을 골라서 Schema에 딱 넣어주게 된다.
반드시 정의시에 꼭 = Query(...)
Artem Podrez 님의 사진, 출처: Pexels