2023.02.22 - [백엔드/DRF(Django REST Framework)] - [DRF] 영화정보_API(1)
가상환경설정이 안되어있다면 위에 설정을 먼저 봐주세요.
모델(model)
영화에 대한 기본 정보를 담을 수 있는 Movie 모델을 생성해보자.
Movie 모델에는 name(이름), opening_date(개봉일), running_time(상영 시간), overview(간략한 소개 문구) 필드가 존재한다.
## movies/models.py
from django.db import models
class Movie(models.Model):
name = models.CharField(max_length=30)
opening_date = models.DateField()
running_time = models.IntegerField()
overview = models.TextField()
## 터미널
python manage.py makemigrations
python manage.py migrate
python manage.py loaddata movies.json
# loaddata는 JSON 형식의 파일로부터 데이터를 받아 Django 데이터 베이스에 입력해 주는 명령어
모델 생성과 마이그레이션도 끝!
시리얼라이즈(serializers)
다음으로 시리얼라이즈를 생성했다. movies에 serializers.py 파일을 만든 후 작성해주면 된다.
시리얼라이즈를 생성하기 위해선 꼭 이 코드를 작성해줘야 한다.
from rest_framework import serializers
다음으로, 생성할 MovieSerializer에 Serializer 클래스를 상속시키고(class MovieSerializer(serializers.Serializer):), Movie 모델에 존재하는 모든 필드를 정의해 준다.
참고로, 사용할 필드 이름은 꼭 모델에서 사용하는 필드 이름과 일치시켜야 한다. 중요중요!
class MovieSerializer(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField()
opening_date = serializers.DateField()
running_time = serializers.IntegerField()
overview = serializers.CharField()
전체코드
## movies/serializers.py
from rest_framework import serializers
from .models import Movie
class MovieSerializer(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField()
opening_date = serializers.DateField()
running_time = serializers.IntegerField()
overview = serializers.CharField()
id를 추가한것은 조회할때 확인해보고싶어서 넣었다.
view
이제 view를 만들어보자.
전체코드
## movies/views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Movie
from .serializers import MovieSerializer
@api_view(['GET'])
def movie_list(request):
movies = Movie.objects.all()
serializer = MovieSerializer(movies, many=True)
return Response(serializer.data, status=200)
먼저, @api_view(['GET'])으로 함수형 뷰인 movie_list()가 GET 메소드만 허용하는 API를 제공한다는 걸 표시한다.
@api_view(['GET'])
def movie_list(request):
# ...
참고로 @로 시작하는 부분(@api_view())은 데코레이터(decorator) 함수인데, 이름 그대로 특정한 함수를 꾸미는 함수이다. 기존 함수를 수정하지 않고 추가 로직을 넣고 싶을 때 사용한다. 위의 코드에서는 movie_list()를 수정하지 않고 api_view()의 기능을 추가하기 위해 데코레이터 함수(@api_view())가 사용했다.
다음으로, 모든 영화 객체를 가져와 MovieSerializer에 넣어 준다.
movies = Movie.objects.all()
serializer = MovieSerializer(movies, many=True)
파라미터로 many를 사용했는데, Movie 모델에서 받아온 데이터가 여러 영화 데이터들을 담고 있기 때문에 사용했다. 이렇게 여러 데이터를 직렬화하는 것이라면 many=True를 써 줘야 한다. 데이터를 하나만 직렬화 한다면 쓰지 않아도 된다.
이렇게 MovieSerializer에 파이썬 객체 형태의 데이터인 movies를 넣어 주면 데이터가 파이썬 딕셔너리 형태로 바뀐다. 변환된 데이터에는 serializer.data로 접근할 수 있다. 해당 결과를 Response에 넣으면 끝!
return Response(serializer.data, status=200)
Response는 rest_framework에서 제공하는 특별한 응답 클래스이다.
MovieSerializer를 통해 파이썬 딕셔너리로 변환된 데이터는 Response에서 최종적으로 JSON 형태로 바뀐다.
status=200은 상태코드를 말하는데 다양한 상태코드는 이 게시물을 확인하면 된다.
2023.01.30 - [백엔드/Django] - [Django] 상태 코드(Status Code)
URL 설정하고 확인하기
마지막으로, URL을 설정만 남았다. 이때 URL은 프로젝트와 앱 디렉토리에 모두 추가해야 한다.
## movie_api/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('movies.urls')),
]
## movies/urls.py
from django.urls import path
from .views import movie_list
urlpatterns = [
path('movies', movie_list),
]
이제 서버를 실행시킨 후 http://localhost:8000/movies로 접속해 잘 동작하는지 확인해보자.
## 터미널
python manage.py runserver
데이터가 json형태로 잘 나오는 것을 알 수 있다.여기에 넣은 데이터 json파일은 다른곳에서 가져온것이라 올리지 못했다.
'Python > DRF(Django REST Framework)' 카테고리의 다른 글
[DRF] 영화정보_API(1) (0) | 2023.02.22 |
---|---|
[DRF] Todo 목록 API만들기(6) (0) | 2023.01.30 |
[DRF] Todo 목록 API만들기(5) (0) | 2023.01.30 |
[DRF] Todo 목록 API만들기(4) (0) | 2023.01.30 |
[DRF] Todo 목록 API만들기(3) (0) | 2023.01.30 |
댓글