django에서 Restful API를 개발하기 위한 라이브러리
모든 데이터는 기본적으로 CRUD로 관리될 수 있다.
DRF는 Class Based View를 활용하여 중복을 줄일 수 있음.
CRUD란?
C: Create(생성) - 새 레코드 생성
R: Read, Retrieve(조회) - 레코드 목록 조회, 특정 레코드 조회
U: Update(수정) - 특정 레코드 수정
D: Delete(삭제) - 특정 레코드 삭제
# 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(삭제)할 수 있다.
# 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 결과값을 얻을 수 있다.
APIView를 상속받아서 CBV형태로 View를 만들면 원하는 메소드만 지원하는 API View를 만들 수 있다. @api_view 데코레이터를 사용해서 FBV 형태로도 만들 수 있다.
# 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)
# 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)