앞서 Django Rest Framework를 통해 GET, POST, PUT, DELETE를 다뤘다.
모두 함수를 만들어 진행했고, @api_view 데코레이터를 통해 request method를 적용시켰다.
함수 안에 if, else등과 같은 코드들이 많이 들어감을 알 수 있었다.
이것을 좀 더 보기 좋게 구조화 시키기 위해 APIView를 활용해 클래스화 한다.
[** APIView **]
- django.rest_framework.APIView 를 상속
- 클래스 안에 request method에 해당하는 함수들을 만듬
- 세부적인 변수가 필요할 경우에는 get_object()함수를 만들어 적용(관습)
#---------- categories/views.py 변경 전
@api_view(['GET', 'PUT', 'DELETE'])
def categoryDetail(request, category_pk):
try:
category = Category.objects.get(pk=category_pk) #카테고리 검색
except Category.DoesNotExist:
raise NotFound
if request.method == "GET":
serializer = CategorySerializer(category)
return Response(serializer.data)
elif request.method == "PUT":
category = Category.objects.get(pk=category_pk)
serializer = CategorySerializer(
category,
data=request.data,
partial=True,
)
if serializer.is_valid():
updated_category = serializer.save() #update 호출
return Response(CategorySerializer(updated_category).data)
else:
return Response(serializer.errors)
elif request.method == 'DELETE':
category.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
#---------- categories/views.py 변경 후
from rest_framwork import APIView
class CategoryDetail(APIView):
#----- category 변수 만들기
def get_object(self, category_pk):
try:
category = Category.objects.get(pk=category_pk) #카테고리 검색
except Category.DoesNotExist:
raise NotFound
return category
#----- get, put, delete(request method들 함수화)
def get(self, request, category_pk):
serializer = CategorySerializer(self.get_object(category_pk))
return Response(serializer.data)
def put(self, request, category_pk):
category = self.get_object(category_pk)
serializer = CategorySerializer(
category,
data=request.data,
partial=True,
)
if serializer.is_valid():
updated_category = serializer.save() #update 호출
return Response(CategorySerializer(updated_category).data)
else:
return Response(serializer.errors)
def delete(self, request, category_pk):
self.get_object(category_pk).delete()
return Response(status=status.HTTP_204_NO_CONTENT)
'FrameWork > Django' 카테고리의 다른 글
DB transaction (0) | 2024.07.20 |
---|---|
DRF Serializer (0) | 2024.07.18 |
DRF UPDATE * DELETE (0) | 2024.07.18 |
DRF POST & validate & save (1) | 2024.07.18 |
DRF(Django Rest Framework) (0) | 2024.07.17 |