이전 포스팅에서 Django REST API 프레임워크의 설치 방법 및 간단한 셋업 방법에 대해 알아봤습니다.
https://android-developer.tistory.com/80
이번 포스팅에서는
Django REST API를 사용한 CRUD 실시 방법에 대해 알아보겠습니다.
- Django REST API를 사용한 GET / POST
Django REST API를 사용한 GET / POST
사실 이전 포스팅에서 GET에 대한 방법은 이미 배웠습니다.
# /api/views.py
from watchlist_app.models import Movie
from api.serializers import MovieSerializer
from rest_framework.response import Response
from rest_framework.decorators import api_view
@api_view()
def moive_list(reqsuet):
movies = Movie.objects.all()
serializer = MovieSerializer(movies, many=True)
return Response(serializer.data)
@api_view()
def movie_detail(request, pk):
movie = Movie.objects.get(pk=pk)
serializer = MovieSerializer(movie)
return Response(serializer.data)
Django REST API에서는 @api_view()를 사용하여 GET, POST, PUT, DELETE 중에서 어떤 것을 실시할지
설정할 수 있습니다.
공식 문서는 다음과 같습니다.
https://www.django-rest-framework.org/api-guide/views/#function-based-views
GET을 사용하는 방법은 이미 배웠기 때문에
POST를 사용하는 방법에 대해 알아보겠습니다.
api/views.py 파일을 다음과 같이 수정합니다.
# ap/views.py
from watchlist_app.models import Movie
from api.serializers import MovieSerializer
from rest_framework.response import Response
from rest_framework.decorators import api_view
@api_view(['GET', 'POST'])
def moive_list(request):
# api 응답 종류에 따라 다른 처리를 하도록한다.
if request.method == 'GET':
movies = Movie.objects.all()
serializer = MovieSerializer(movies, many=True)
return Response(serializer.data)
if request.method == 'POST':
serializer = MovieSerializer(data = request.data)
# POST로 넣을 데이터가 유효한 데이터인지 확인
if serializer.is_valid():
# 데이터 저장 처리 실시
serializer.save()
# 저장 결과를 돌려준다.
return Response(serializer.data)
else:
return Response(serializer.errors)
그리고 api/serializers.py 파일을 다음과 같이 수정합니다.
# api/serilaizers.py
from rest_framework import serializers
from watchlist_app.models import Movie
class MovieSerializer(serializers.Serializer):
# 각 변수별로 serialize한 데이터를 받는다.
id = serializers.IntegerField(read_only=True)
name = serializers.CharField()
description = serializers.CharField()
active = serializers.BooleanField()
# serializer.save()에 의해 호출된다.
def create(self, validated_data):
return Movie.objects.create(**validated_data)
위 코드에서 **validated_data의 **는 유효성이 검증된 데이터라는 의미이다.
MovieSerializer 클래스에서 새롭게 정의한 create 함수는 위에서 정의한 serializer.save() 함수를 호출한 이후 자동으로 호출된다.
간단하게 말하면
- serializer.save() 호출
- create() 함수 또는 update() 함수 호출
- 2번이 끝나면 Response(serializer.data)를 return 처리
여기까지 하고 장고 프로젝트를 re-build 하고 /movie/list/에 접속합니다.
그럼 다음과 같은 화면을 볼 수 있습니다.
이렇게 POST 옵션이 추가된 것을 확인할 수 있습니다.
그리고 아래로 내려가면 다음과 같은 입력 칸이 생긴 것도 확인할 수 있습니다.
여기에 다음과 같이 입력하고 POST 버튼을 눌러봅니다.
그럼 다음과 같이 입력한 값이 실제로 들어간 것을 확인할 수 있습니다.
@api_view에 POST 옵션을 주는것 만으로
장고 REST API 프레임 워크를 사용하여 POST를 할 수 있게 되었습니다.
(실제로 외부에서 REST API를 사용하여 CRUD를 실시하는 방법은 다음 포스팅에서 진행하겠습니다.)
여기서 의아한 점을 하나 느꼈습니다.
분명 MovieSerializer 클래스의 파라미터는 serializers.Serializer 1개인데
왜 다음과 같이 2개 이상의 인자를 받을 수 있을까요?
serializer = MovieSerializer(movie, data=request.data)
그 이유는 Serializer 클래스가 다음과 같은 파라미터를 받을 수 있기 때문입니다.
- instance: 이미 존재하는 모델 인스턴스를 제공하면, 이 인스턴스를 업데이트하는 데 사용됩니다. 이는 주로 PUT 요청을 처리할 때 사용됩니다.
- data: 새로운 데이터를 제공하면, 이 데이터는 새로운 인스턴스를 생성하거나 기존 인스턴스를 업데이트하는 데 사용됩니다. POST 또는 PUT 요청을 처리할 때 사용됩니다.
- context: 이는 선택적 인자로, Serializer가 현재 콘텍스트에 대한 정보를 가질 수 있게 합니다. 예를 들어, 현재 요청 또는 뷰 인스턴스 등을 포함할 수 있습니다.
- partial: 이는 Boolean 값으로, 기본값은 False입니다. True로 설정하면, 제공된 필드만 업데이트됩니다. 이는 주로 PATCH 요청을 처리할 때 사용됩니다.
- many: 이는 Boolean 값으로, 기본값은 False입니다. True로 설정하면, 여러 개의 객체를 한 번에 직렬화하거나 역직렬화할 수 있습니다.
즉, 아래 코드는
serializer = MovieSerializer(movie, data=request.data)
다음과 같은 의미입니다.
serializer = MovieSerializer(instance=movie, data=request.data)
위 내용은 아래의 공식 문서 튜토리얼에서도 확인할 수 있습니다.
https://www.django-rest-framework.org/tutorial/2-requests-and-responses/
Django REST API를 사용한 PUT / DELETE
이번에는 movie_detail 함수에 다음과 같이 코드를 추가합니다.
# /api/views.py
from watchlist_app.models import Movie
from api.serializers import MovieSerializer
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework import status
@api_view(['GET', 'PUT', 'DELETE'])
def movie_detail(request, pk):
if request.method == 'GET':
# 가져올 데이터를 선택
movie = Movie.objects.get(pk=pk)
serializer = MovieSerializer(movie)
return Response(serializer.data)
if request.method == 'PUT':
# 수정할 데이터를 지정
serializer = MovieSerializer(movie, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors)
if request.method == 'DELETE':
# 삭제할 데이터를 선택
movie = Movie.objects.get(pk=pk)
movie.delete()
# 삭제한 후 삭제가 성공했다는 결과를 돌려줘야한다.
return Response(status=status.HTTP_204_NO_CONTENT)
위와 같이 함수를 수정하고 movie/list/1에 들어가면 다음과 같은 화면을 확인할 수 있습니다.
DELETE 버튼이 생겼고 밑에 POST를 추가했을 때와 마찬가지로 입력할 수 있는 칸이 생겼습니다.
이제 이 화면에서 PUT, DELETE 기능을 실시할 수 있습니다.
참고로 DELETE에서 사용한 Response 코드는 다음 문서에서 확인할 수 있습니다.
https://www.django-rest-framework.org/api-guide/status-codes/
'파이썬(Python) > 장고(Django)' 카테고리의 다른 글
[기초] 파이썬 장고 REST API 프레임워크 - Validation (0) | 2024.02.02 |
---|---|
[기초] 파이썬 장고 REST API 프레임 워크 - Class-based Views (0) | 2024.02.01 |
파이썬 Django REST API 프레임 워크 사용하기 - 기초편 (0) | 2024.01.28 |
파이썬 Django를 사용해서 Rest API 통신 서버 만들기 - 2 (0) | 2024.01.27 |
파이썬 Django를 사용해서 Rest API 통신할 수 있는 서버 만들기 - 1 (0) | 2023.11.30 |
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
댓글