이제 RestFramework를 스피드하게 구현해 보도록 하겠습니다. 이번 포스팅의 새로운점이라고 하면 Viewsets를 사용한다는 점입니다. 전보다 더 깔끔한 코드와 체계적인 구조를 보실 수 있을겁니다.
바로 rest_framework의 viewsets를 통해 구조를 짜보겠습니다.
/user_order/views.py
from rest_framework import viewsets, status
from .models import Shop, Order
from .serializers import ShopSerializer, OrderSerializer
from rest_framework.response import Response
from rest_framework.parsers import JSONParser
class ShopViewSet(viewsets.ViewSet):
def list(self, request): # /api/shop/
shops = Shop.objects.all()
serializer = ShopSerializer(shops, many=True)
return Response(serializer.data)
def create(self, request): # /api/shop/
data = JSONParser().parse(request);
serializer = ShopSerializer(data=data)
serializer.is_valid(raise_exceptions=True)
serializer.save()
return Response(serializer.data, status.HTTP_201_CREATED)
def retrieve(self, request, pk=None): # /api/shop/<str:idx>/
shop = Shop.objects.get(id=pk)
serializer = ShopSerializer(shop)
return Response(serializer.data)
def update(self, request, pk=None): # /api/shop/<str:idx>/
shop = Shop.objects.get(id=pk)
data = JSONParser().parse(request);
serializer = ShopSerializer(instance=shop, data=data)
serializer.is_valid(raise_exceptions=True)
serializer.save()
return Response(serializer.data, status.HTTP_202_ACCEPTED)
def destroy(self, request, pk=None): # /api/shop/<str:idx>/
shop = Shop.objects.get(id=pk)
shop.delete()
return Response(status.HTTP_204_NO_CONTENT)
class OrderViewSet(viewsets.ViewSet):
def list(self, request): # /api/order/
orders = Shop.objects.all()
serializer = OrderSerializer(orders, many=True)
return Response(serializer.data)
def create(self, request): # /api/order/
data = JSONParser().parse(request);
serializer = OrderSerializer(data=data)
serializer.is_valid(raise_exceptions=True)
serializer.save()
return Response(serializer.data, status.HTTP_201_CREATED)
def retrieve(self, request, pk=None): # /api/order/<str:idx>/
order = Order.objects.get(id=pk)
serializer = OrderSerializer(order)
return Response(serializer.data)
def update(self, request, pk=None): # /api/order/<str:idx>/
order = Order.objects.get(id=pk)
data = JSONParser().parse(request);
serializer = OrderSerializer(instance=order, data=data)
serializer.is_valid(raise_exceptions=True)
serializer.save()
return Response(serializer.data, status.HTTP_202_ACCEPTED)
def destroy(self, request, pk=None): # /api/order/<str:idx>/
order = Order.objects.get(id=pk)
order.delete()
return Response(status.HTTP_204_NO_CONTENT)
list, create, retrieve, update, destroy를 viewsets를 통해 손쉽게 생성할 수 있습니다. GET, POST, DELETE요청등을 처리하는 것입니다. 그리고 아래 3개는 추가적인 인수를 필요로 합니다. 이는 APi경로상 추가적인 pk를 나타냅니다. 이의 이름은 바뀔 수 있으며 각각의 API경로는 주석으로 나타냈습니다.
그리고 각각의 내용을 ShopSerializer, OrderSerializer를 활용하여 넣고 빼고 지우고를 간단히 했습니다. 그리고 status를 이용하여 성공 코드를 손쉽게 표현했습니다. 그리고 serializer.is_valid를 통해서 Model상에 맞지 않는 데이터가 있으면 exception발생하게 했습니다. 각각 안의 과정은 쉬워서 그냥 넘어가도록 하겠습니다.
그다음으로는 urls.py를 수정할 차례입니다.
/user_order/urls.py
from django.urls import path
from .views import ShopViewSet, OrderViewSet
urlpatterns = [
path('shop', ShopViewSet.as_view({
'get': 'list',
'post': 'create'
})),
path('shop/<str:pk>', ShopViewSet.as_view({
'get': 'retrieve',
'put': 'update',
'delete': 'destroy'
})),
path('order', OrderViewSet.as_view({
'get': 'list',
'post': 'create'
})),
path('order/<str:pk>', OrderViewSet.as_view({
'get': 'retrieve',
'put': 'update',
'delete': 'destroy'
})),
]
저번과 다르긴 하지만, 직관적으로 이해되는 코드일겁니다. 그냥 넘어가도록 하겠습니다. 그다음에는 order의 urls.py를 수정해서 이와 연결되도록 해보겠습니다.
/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('user_order.urls'))
]
이렇게 대략적으로 RestFramework를 간단히 짜보았습니다.