GenericAPIView

Generic views 공식문서
클래스 기반 뷰의 메서드와 기능을 일목요연하게 정리해놓은 사이트

결론적으로 Generic 클래스 기반 뷰를 사용하면 코드량을 줄일 수 있으며 서브쿼리를 이용하여 검색, 정렬, 필터링기능도 간편하게 사용할 수 있다. 아래는 예시

class PostView(ListAPIView):
  queryset = Post.objects.all()
  serializer_class = PostPostSerializer
  pagination_class = PageNumberPagination
  filter_backends = (SearchFilter, OrderingFilter)
  search_fields = ('title','content',)

1. Attributes


Basic Settings:

  • queryset : 해당 클래스 뷰에서 객체를 리턴하고자 할 때 사용한다.
  • serializer_class : 요청의 검증작업이 필요할 때, 그리고 요청받은 데이터를 serializer화 시킬 때 사용한다.
  • lookup_field : 기본 값은 'pk', 검색, 수정, 삭제 등 하나의 객체에 접근할 때사용

Pagination

  • pagination_class : 예를 들어 전체 1000개의 데이터가 있다면 10개의 데이터를 100페이지로 사용하고자 할 때

Filtering

  • filter_backends : 쿼리셋을 필터링하는데 사용한다. 검색이나 정렬, 필터링을 적용시킬 때 사용한다.

2. Concrete View Classes


클래스 뷰는 rest_framework.generics에서 가져올 수 있다.

from rest_framework import generics

url 설정시 함수형 뷰와는 다르게 as_view()를 적용시켜야 한다.

path('posts/',views.PostView.as_view())

CreateAPIView (생성)

post 메서드 핸들러를 제공한다. 요청에 대한 응답은 성공시 201 Created와 함께 serialized representation, 실패시 400 Bad Request

class PostCreateView(generics.CreateAPIView):
  queryset = Post.objects.all()
  serializer_class = PostSerializers

ListAPIView (읽기)

get 메서드 핸들러를 제공한다. 쿼리셋을 반환할 때 사용한다. 쿼리셋의 serialized representation과 함께 200 OK의 응답을 반환한다. Pagination을 통해 응답을 선택적으로 페이징할 수 있다.

from rest_framework.pagination import PageNumberPagination

class PostListView(generics.ListAPIView):
  queryset = Post.objects.all()
  serializer_class = PostSerializers
  pagination_class = PageNumberPagination
# settings.py
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASSES' : ('rest_framework.pagination.PageNumberPagination',),
    'PAGE_SIZE': 3,
}
  • Pagination을 적용하고 싶으면 settings.py에서 DEFAULT_PAGINATION_CLASSES를 설정해주어야 한다.

ListCreateAPIView (생성 + 읽기)

get, post 메서드 핸들러를 제공한다. get요청과 post 요청을 받을 수 있다. ListAPIView, CreateAPIView를 합친 것이다.

RetrieveAPIView (상세페이지)

get 메서드 핸들러를 제공한다. 객체를 검색 할 수 있는 경우 200 OK와 함께 serialized representation, 그렇지 않으면 404 Not Found Request응답을 반환한다. 그러나 여러개의 객체가 검색되는 경우는 500 Server Error의 응답을 반환하므로 매개변수는 pk와 같은 unique한 값이어야한다.

urlpatterns = [
  path('posts/<int:pk>/',views.PostDetailView.as_view())
]
class PostDetailView(generics.RetrieveAPIView):
  queryset = Post.objects.all()
  serializer_class = PostSerializers
  • 기본적으로는 pk로 상세페이지를 불러온다. pk외에 다른 매개변수를 사용하고 싶을 때는 아래 참고
path('posts/<title>',views.PostDetailView.as_view())
# lookup_field 적용
class PostDetailView(generics.RetrieveAPIView):
  queryset = Post.objects.all()
  serializer_class = PostSerializers
  lookup_field = 'title'
  • 주의 할 점. title이 중복되는 경우 500 서버에러를 발생시키므로 반드시 매개변수는 unique한 값이어야 한다.

DestroyAPIView (삭제)

delete 메서드 핸들러를 제공한다. 객체를 삭제하면 204 No Content를, 객체가 존재하지 않을 경우 404 Not Found의 응답을 반환한다. 하나의 객체를 삭제하므로 매개변수는 unique한 값이어야 한다.

urlpatterns = [
  path('posts/<int:pk>/',views.PostDeleteView.as_view())
]
class PostDeleteView(generics.DestroyAPIView):
  queryset = Post.objects.all()
  serializer_class = PostSerializers

UpdateAPIView

put, patch 메서드 핸들러를 제공한다. 하나의 객체를 수정할 때 사용한다. 업데이트 완료시 200 OK와 함께 serialized representiation의 응답을 반환하지만 데이터가 invalid 한경우 400 Bad Request를 반환한다. 역시, 매개변수는 unique한 값이어야한다.

urlpatterns = [
  path('posts/<int:pk>/',views.PostUpdateView.as_view())
]
class PostUpdateView(generics.DestroyAPIView):
  queryset = Post.objects.all()
  serializer_class = PostSerializers

RetrieveUpdateAPIView

get, put, patch 메서드 핸들러를 제공한다. 하나의 객체에서 사용되는 것이므로 매개변수는 unique 값이어 한다. 상세페이지 검색과 수정을 하고자할 때 사용한다.

RetrieveDestroyAPIView

get, delete 메서드 핸들러를 제공한다. 하나의 객체에서 사용되는 것이므로 매개변수는 unique 값이어야 한다. 상세페이지 검색과 삭제를 하고자할 때 사용한다.

RetrieveUpdateDestroyAPIView

get, put, patch, delete 메서드 핸들러를 제공한다. 하나의 객체에서 사용되는 것이므로 매개변수는 unique 값이어야 한다. 상세페이지 검색, 삭제, 수정을 하고자할 때 사용한다