Tiny Finger Point Hand With Heart
본문 바로가기
Python/DRF(Django REST Framework)

[DRF] 영화정보_API(2)

by yoondii 2023. 2. 22.
728x90
반응형

 

 

2023.02.22 - [백엔드/DRF(Django REST Framework)] - [DRF] 영화정보_API(1)

 

[DRF] 영화정보_API(1)

오늘은 영화정보를 관리하는 api를 만들어보려고 한다. 먼저 환경설정을 하자. #먼저 가상환경 설정 python -m venv venv #가상환경실행 . venv/bin/activate #pip설치 (버전은 맘대로) pip install django==4.0 djangor

yoondii.tistory.com

가상환경설정이 안되어있다면 위에 설정을 먼저 봐주세요.


모델(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

 

다음으로, 생성할 MovieSerializerSerializer 클래스를 상속시키고(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)

 

[Django] 상태 코드(Status Code)

상태 코드(Status Code)는 클라이언트 요청에 대한 처리가 성공했는지 실패했는지에 대해 알려주는 코드로 앞자리에 따라 크게 5가지 카테고리로 분류됩니다. 아래는 각 분류별 몇 가지 상태 코드

yoondii.tistory.com


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파일은 다른곳에서 가져온것이라 올리지 못했다.

728x90
반응형

'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

댓글