Class Based View 특징
- 클래스형 뷰에서는 특정 Http Method에 대한 처리를 함수로 분리할 수 있음
→ GET요청에 대한 처리는 get()에서, POST 요청에 대한 처리는 post()에서 정의 가능
Class Based View 종류
- APIView - DRF CBV의 베이스 클래스
- GenericAPIView
- 일반적인 API 작성을 위한 기능이 포함된 클래스
- 보통 CRUD 기능이 대부분인 상황을 위해 여러가지 기능이 미리 내장됨
- Mixin
- 재사용 가능한 여러가지 기능을 담고있느 클래스
- 말그대로 여러 클래스를 섞어서 사용하기 위한 클래스
- ListModelMixin - 리스트 반환 API를 만들기 위해 상속 받는 클래스
- CreateModelMixin - 새로운 객체를 생성하는 API를 만들기위해 상속 받는 클래스
- ViewSets
- 여러 엔드포인트(endpoint)를 한 번에 관리할 수 있는 클래스
- RESTful API에서 반복되는 구조를 더 편리하게 작성할 수 있는 방법을 제공
CBV 사용해보기
views.py
class ArticleListAPIView(APIView):
def get(self, request):
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
def post(self, request):
serializer = ArticleSerializer(data=request.data)
# return Response(serializer.errors, status=400)을 대신함
if serializer.is_valid(raise_exception=True):
serializer.save()
# 201은 created
return Response(serializer.data, status=status.HTTP_201_CREATED)
class ArticleDetailAPIView(APIView):
# 자주 쓰는 함수는 요렇게 따로 정의
def get_object(self, pk):
return get_object_or_404(Article, pk=pk)
def get(self, request, pk):
article = self.get_object(pk)
serializer = ArticleSerializer(article)
return Response(serializer.data)
def put(self, request, pk):
article = self.get_object(pk)
# 앞에 article을 넣어야 instance처럼 동작
serializer = ArticleSerializer(
article, data=request.data, partial=True) # partial은 부분 필드만 고치고 싶을때
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
def delete(self, request, pk):
article = self.get_object(pk)
article.delete()
return Response(status=status.HTTP_204_NO_CONTENT) # 204는 삭제
urls.py
from django.urls import path
from . import views
app_name = "articles"
urlpatterns = [
# 클래스 사용시 as_view()함수로 함수취급을 해줘야함.
path("", views.ArticleListAPIView.as_view(), name="article_list"),
path("<int:pk>/", views.ArticleDetailAPIView.as_view(), name="article_detail"),
# 함수 사용시
# path("", views.article_list, name="article_list"),
# path("<int:pk>/", views.article_detail, name="article_detail"),
]
'Django' 카테고리의 다른 글
Serializer 활용하기 (0) | 2024.08.29 |
---|---|
Relationship과 DRF(with. particular seed) (0) | 2024.08.29 |
DRF와 Postman (GET, PUT, DELETE, POST) (0) | 2024.08.29 |
Django Seed(Response와 Serializer) (0) | 2024.08.29 |
장고 TemplateSyntaxError (0) | 2024.08.28 |