Django view는 function based view와 class based view가 있다
class based view 특징
- 특정 Http Method에 대한 처리를 함수로 분리할 수 있다
- get 요청에 대한 처리는 get()에서 post 요청에 대한 처리는 post()에서 정의가 가능하다
- 클래스를 사용하기 때문에 코드의 재사용과 유지보수성이 향상된다
- 기본 APIView외에도 여러 편의를 제공하는 다양한 내장 CBV가 존재한다
class Based view 종류
- APIView - DRF CBV의 베이스 클래스
- GenericAPIView
- Mixin
- ViewsSets
- ...
아래와 같은 형태로 된 함수 기반의 뷰를 클래스 기반의 뷰로 수정하면
@api_view(["GET", "DELETE", "PUT"])
def article_detail(request, pk):
if request.method == "GET":
# pk에 해당하는 article 조회
# article = Article.objects.get(pk=pk)
article = get_object_or_404(Article, pk=pk)
# serialization
serializer = ArticleSerializer(article)
# return
return Response(serializer.data)
elif request.method == "PUT":
article = get_object_or_404(Article, pk=pk)
serializer = ArticleSerializer(article, data=request.data, partial=True)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
else:
article = get_object_or_404(Article, pk=pk)
article.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
다음과 같은 클래스 기반의 뷰로 수정이 가능하다
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)
# serialization
serializer = ArticleSerializer(article)
# return
return Response(serializer.data)
def delete(self, request, pk):
article = self.get_object(pk)
article.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
def put(self, request, pk):
article = self.get_object(pk)
serializer = ArticleSerializer(article, data=request.data, partial=True)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
urls.py또한 수정이 필요하다
함수 기반의 뷰에서 다음과 같은 코드로 작동했다면
path("<int:pk>/", views.article_detail, name="article_detail"),
클래스 기반의 뷰에서는 다음과 같이 수정해주어야 한다
path("<int:pk>/", views.ArticleDetailAPIView.as_view(), name="article_detail"),
'[내일배움캠프]스파르타코딩클럽 AI 웹개발 > Today I Learned' 카테고리의 다른 글
[TIL] Django ORM (0) | 2024.08.30 |
---|---|
pycharm django 환경설정 (0) | 2024.08.29 |
[TIL] annotate (0) | 2024.08.27 |
[TIL] (0) | 2024.08.26 |
[TIL] (0) | 2024.08.25 |