본문 바로가기
파이썬(Python)/장고(Django)

파이썬 Django REST API 프레임워크 CRUD 사용하기

by 기계공학 주인장 2024. 1. 31.
반응형

이전 포스팅에서 Django REST API 프레임워크의 설치 방법 및 간단한 셋업 방법에 대해 알아봤습니다.

 

https://android-developer.tistory.com/80

 

파이썬 Django REST API 프레임 워크 사용하기 - 기초편

이전 포스팅에서는 파이썬의 Django을 설치하는 방법과 기본적인 원리를 설명했습니다. 이번 포스팅에서도 이어서 하기 때문에 아래의 포스팅을 먼저 보는 것을 추천합니다. 파이썬 Django를 사용

android-developer.tistory.com

 

이번 포스팅에서는

 

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

 

Views - Django REST framework

 

www.django-rest-framework.org

 

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() 함수를 호출한 이후 자동으로 호출된다.

 

간단하게 말하면

 

  1. serializer.save() 호출
  2. create() 함수 또는 update() 함수 호출
  3. 2번이 끝나면 Response(serializer.data)를 return 처리

여기까지 하고 장고 프로젝트를 re-build 하고 /movie/list/에 접속합니다.

 

그럼 다음과 같은 화면을 볼 수 있습니다.

 

이렇게 POST 옵션이 추가된 것을 확인할 수 있습니다.

 

 

그리고 아래로 내려가면 다음과 같은 입력 칸이 생긴 것도 확인할 수 있습니다.

 

 

여기에 다음과 같이 입력하고 POST 버튼을 눌러봅니다.

 

id는 자동으로 입력해주기 때문에 생략할 수 있다.

 

그럼 다음과 같이 입력한 값이 실제로 들어간 것을 확인할 수 있습니다.

 

 

@api_view에 POST 옵션을 주는것 만으로 

 

장고 REST API 프레임 워크를 사용하여 POST를 할 수 있게 되었습니다. 

 

(실제로 외부에서 REST API를 사용하여 CRUD를 실시하는 방법은 다음 포스팅에서 진행하겠습니다.)


여기서 의아한 점을 하나 느꼈습니다.

 

분명 MovieSerializer 클래스의 파라미터는 serializers.Serializer 1개인데

 

왜 다음과 같이 2개 이상의 인자를 받을 수 있을까요?

 

serializer = MovieSerializer(movie, data=request.data)

 

그 이유는 Serializer 클래스가 다음과 같은 파라미터를 받을 수 있기 때문입니다.

 

  1. instance: 이미 존재하는 모델 인스턴스를 제공하면, 이 인스턴스를 업데이트하는 데 사용됩니다. 이는 주로 PUT 요청을 처리할 때 사용됩니다.
  2. data새로운 데이터를 제공하면, 이 데이터는 새로운 인스턴스를 생성하거나 기존 인스턴스를 업데이트하는 데 사용됩니다. POST 또는 PUT 요청을 처리할 때 사용됩니다.
  3. context: 이는 선택적 인자로, Serializer가 현재 콘텍스트에 대한 정보를 가질 수 있게 합니다. 예를 들어, 현재 요청 또는 뷰 인스턴스 등을 포함할 수 있습니다.
  4. partial: 이는 Boolean 값으로, 기본값은 False입니다. True로 설정하면, 제공된 필드만 업데이트됩니다. 이는 주로 PATCH 요청을 처리할 때 사용됩니다.
  5. 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/

 

2 - Requests and responses - Django REST framework

From this point we're going to really start covering the core of REST framework. Let's introduce a couple of essential building blocks. REST framework introduces a Request object that extends the regular HttpRequest, and provides more flexible request pars

www.django-rest-framework.org


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/

 

Status codes - Django REST framework

 

www.django-rest-framework.org

 

반응형


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


댓글