Django

DRF CBV

zhelddustmq 2024. 8. 29. 15:43

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