본문 바로가기

[내일배움캠프]스파르타코딩클럽 AI 웹개발/Today I Learned

[TIL] DRF class based view

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