https://vicapor.tistory.com/7

 

Django Ninja Tutorial 1

Django Ninja 공식 페이지 : https://django-ninja.rest-framework.com/ 장고 닌자는 FAST API에서 영감을 받아서 만들어진 Web FrameWork이다. 빠른속도와 쉬운 사용법 Swagger 기능 지원을 제공하고 있다. 아직..

vicapor.tistory.com

 

1편에서 이어진 튜토리얼 2이다. 1편을 먼저 확인하고 2편을 진행하면 된다. 이번 튜토리얼에서는 GET 메소드를 구현해보는 시간을 갖는다. 

 

 

1. schema.py 작성

tracks/schema.py 를 생성해주고 아래 코드를 입력해준다.

from datetime import datetime
from ninja import Schema


class TrackSchema(Schema):
    title: str
    artist: str
    duration: float
    last_play: datetime
    

class NotFoundSchema(Schema):
    message: str

이것이 Django Ninja에서 말했던 Pydantic Data Validation을 말한다. 필드에 정확한 값이 전달되는지 검증하기 위해서 사용한다. 각 field의 변수 타입을 명시해주는 것을 통해 잘못된 데이터 값이 들어오는 것을 방지한다. 

 

 

2. api.py 수정

 

1) 모든 데이터 GET

from typing import List

from ninja import NinjaAPI
from tracks.models import Track
from tracks.schema import TrackSchema, NotFoundSchema


api = NinjaAPI()

@api.get("/tracks", response=List[TrackSchema])
def tracks(request):
    return Track.objects.all()

사용방법은 아주 간단하다. 데코레이터를 통해 메소드를 표시한다. get 메소드를 통해 모든 track의 정보를 가져와보겠다. tracks라는 이름의 함수로 Track 모델의 모든 데이터을 return 한다. 

 

response=List[TrackSchema]는 1에서 작성한 Schema의 자료 값을 검증한다음 List로 반환한다. 

 

참고)

typing에 대해 더 알아보고 싶다면 아래 사이트를 참고하면 된다. 

https://www.daleseo.com/python-typing/

 

 

2) 원하는 데이터를 id값으로 GET

@api.get('/tracks/{track_id}', response={200: TrackSchema, 404: NotFoundSchema})
def track(request, track_id: int):
    try:
        track = Track.objects.get(pk=track_id)
        return track
    except Track.DoesNotExist as e:
        return 404, {"message": "Track does not exist"}

{track_id}를 통해 원하는 데이터의 정보를 가져올 수 있다. track_id는 정수가 들어가야 하므로 track_id: int를 명시 해준다.

 

(1) 데이터가 존재할 때 (정상적인 통신 : 200) -> TrackSchema을 실행한다.

(2) 데이터가 존재하지 않을 때 (잘못된 통신 :  404) -> NotFoundSchema

 

try, except를 사용해서 데이터가 존재할 때, Track에 pk 값을 통해 원하는 데이터를 반환하고 존재하지 않을 때, messeage에 Track does not exist라는 메세지를 담아서 404와 같이 return한다. 

 

 

3) 특정 정보를 통해 원하는 데이터 GET

@api.get("/tracks", response=List[TrackSchema])
def tracks(request, title: Optional[str] = None):
    if title:
        return Track.objects.filter(title__icontains=title)
    return Track.objects.all()

1) 에서 작성한 tracks를 수정해주자. 

이제 ?title을 통해 title로 데이터를 가져올 수 있다. 항상 title이 포함되지 않기 때문에 Optional로 설정한다. 

title__icontains을 통해 title의 일부 문자만으로 데이터를 가져올 수 있게 한다.

 

 

'Back-End > Django-ninja' 카테고리의 다른 글

Django Ninja Render  (0) 2021.11.30
Django Ninja Tutorial 5  (0) 2021.11.30
Django Ninja Tutorial 4  (0) 2021.11.30
Django Ninja Tutorial 3  (0) 2021.11.29
Django Ninja Tutorial 1  (0) 2021.07.09

+ Recent posts