Django - DRF - GenericAPIView

김기훈·2025년 11월 23일

Django

목록 보기
7/17

Generic View - 참고자료


  • 정의

  • DRF 에서 제공하는 기본적인 CRUD(Create, Retrieve, Update, Delete)

    • 작업을 수행하는 뷰를 손쉽게 만들 수 있도록 도와주는 클래스
      • 이들은 APIView를 상속받아 특정 작업을 자동으로 처리해주는 뷰 클래스를 제공
  • 장점

    • 간편함 : CRUD 작업을 수행하는 뷰를 간단하게 생성 가능
    • 일관성 : 코드를 간결하고 일관성 있게 유지 가능
    • 재사용성 : 공통 기능을 손쉽게 재사용 가능

Generic View와 ViewSets의 차이

  • genericView: 개별 동작에 대해 각각의 뷰 클래스를 생성
    • 각 동작을 명확하게 분리할 수 있으며, 필요한 동작만 선택적으로 구현 가능
  • ViewSets: 단일 클래스에서 여러 동작을 처리하며, 라우터와 함께 사용됨
    • 더 간결하게 CRUD API를 구성 가능

종류와 사용법

기능 1개

ListAPIView

  • 데이터베이스의 객체 리스트를 조회하는 API를 생성합니다.
from rest_framework.generics import ListAPIView
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelListView(ListAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

CreateAPIView

  • 새로운 객체를 생성하는 API를 생성합니다.
from rest_framework.generics import CreateAPIView
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelCreateView(CreateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

UpdateAPIView

  • 기존 객체를 업데이트하는 API를 생성
from rest_framework.generics import UpdateAPIView
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelUpdateView(UpdateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

DestroyAPIView

  • 특정 객체를 삭제하는 API를 생성
from rest_framework.generics import DestroyAPIView
from .models import MyModel

class MyModelDeleteView(DestroyAPIView):
    queryset = MyModel.objects.all()

RetrieveAPIView

  • 특정 객체의 상세 정보를 조회하는 API를 생성
from rest_framework.generics import RetrieveAPIView
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelDetailView(RetrieveAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

기능 2개

ListCreateAPIView

  • 객체 리스트 조회와 객체 생성을 동시에 처리하는 API를 생성
from rest_framework.generics import ListCreateAPIView
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelListCreateView(ListCreateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
        

RetrieveUpdateAPIView

  • 특정 객체의 조회 및 수정을 처리하는 API를 생성
from rest_framework.generics import RetrieveUpdateAPIView
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelDetailUpdateView(RetrieveUpdateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

RetrieveDestroyAPIView

  • 특정 객체의 조회 및 삭제를 처리하는 API를 생성
from rest_framework.generics import RetrieveDestroyAPIView
from .models import MyModel

class MyModelDetailDeleteView(RetrieveDestroyAPIView):
    queryset = MyModel.objects.all()

기능 3개

RetrieveUpdateDestroyAPIView

  • 특정 객체의 조회, 수정, 삭제를 모두 처리하는 API를 생성
from rest_framework.generics import RetrieveUpdateDestroyAPIView
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelDetailView(RetrieveUpdateDestroyAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

추가

ConcreteAPIView ✨

  • GenericAPIView + Mixins = ConcreteAPIView
  • ListModelMixin
    • DRF에서 "목록 조회 기능(GET /list)"을 손쉽게 추가해주는 Mixin
class PostListAPIView(ListModelMixin, GenericAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

    def get(self, request):
        return self.list(request)

실습

  • 1 블로그 목록 상세 API

    • model 지워도 됨 / Q(published_at__gte=timezone.now())= datetime 오류 제거

  • 동일한 기능을 하는 코드 단순화

  • 2 블로그 생성 수정 삭제 API

  • 글의 작성자와 수정/삭제/생성 하는 유저가 동일 할 때 이 기능을 이용가능 한게 함
  • 3 댓글 목록 생성 API

    • 댓글 수 세기 / 작성자 이름

  • 4 댓글 수정 삭제 API

    • Retrieve 는 댓글 수정 삭제에 필요 X

profile
안녕하세요.

0개의 댓글