DRF로 간단한 API 만들기

jun·2023년 2월 2일

장고스터디

목록 보기
4/4

DRF (Django Rest Framework)

django에서 Restful API를 개발하기 위한 라이브러리
모든 데이터는 기본적으로 CRUD로 관리될 수 있다.
DRF는 Class Based View를 활용하여 중복을 줄일 수 있음.

1. 주요 기능들

  • Serializer/ModelSerializer를 통한 데이터 유효성 검증 및 데이터 직렬화
  • 각종 Parser를 통한 데이터 처리
  • APIView/Generic/ViewSet/ModelViewSet를 통한 요청 처리
  • 각종 Renderer를 통한 다양한 응답 포맷 지원

CRUD란?
C: Create(생성) - 새 레코드 생성
R: Read, Retrieve(조회) - 레코드 목록 조회, 특정 레코드 조회
U: Update(수정) - 특정 레코드 수정
D: Delete(삭제) - 특정 레코드 삭제

2. DRF 샘플 구현

# myapi/models.py
from django.db import models

class Post(models.Model):
    message = models.TextField()
# myapi/serializer.py
from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'
# myapi/views.py
from rest_framework import viewsets
from .models import Post
from .serializer import PostSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
# myapi/urls.py
from rest_framework.routers import DefaultRouter
from . import views
from django.urls import path, include

router = DefaultRouter()
router.register('posts', views.PostViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

위 샘플코드를 따르면 Post를 GET, POST할 수 있다. 또한 /<int:pk>값으로 특정 post를 PUT(업데이트), DELETE(삭제)할 수 있다.


3. 포스팅 조회 요청에 username을 응답하려면?

# myapi/serializer.py
from django.contrib.auth import get_user_model
from rest_framework import serializers
from .models import Post

class AuthorSerializer(serializers.ModelSerializer):
	class Meta:
    	model = get_user_model()
        fields = ['username']
        
class PostSerializer(serializers.ModelSerializer):
	author = AuthorSerializer()
    class Meta:
    	model = Post
        fields = '__all__'

위 샘플코드를 따르면 중첩된 JSON response 결과값을 얻을 수 있다.

4. APIView

APIView를 상속받아서 CBV형태로 View를 만들면 원하는 메소드만 지원하는 API View를 만들 수 있다. @api_view 데코레이터를 사용해서 FBV 형태로도 만들 수 있다.

  • APIView 구현 샘플 (list/create)
# myapi/views.py
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Post
from .serializers import PostSerializer

class PostListAPIView(APIView):
    
    def get(self, request):
        qs = Post.objects.all()
        serializer = PostSerializer(qs, many=True)

        return Response(serializer.data)

    def post(self, request):
        serializer = PostSerializer(data=request.data)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)

        return Response(serializer.errors, status=400)
  • APIView 구현 샘플 (detail/update/delete)
# myapi/views.py
from django.shortcuts import get_object_or_404
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Post
from .serializers import PostSerializer

class PostDetailAPIView(APIView):
    def get_object(self, pk):
        return get_object_or_404(Post, pk=pk)

    def get(self, request, pk, format=None):
        post = self.get_object(pk)
        serializer = PostSerializer(post)
        return Response(serializer.data)

    def put(self, request, pk):
        post = self.get_object(pk)
        serializer = PostSerializer(post, data=request.data)
        
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk):
        post = self.get_object(pk)
        post.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
  • @api_view데코레이터를 사용한 FBV구현 방법
@api_view(['GET'])
def public_post_list(request):
	qs = Post.objects.filter(is_public=True)
    serializer = PostSerializer(qs, many=True)
    return Response(serializer.data)
profile
hi

0개의 댓글