티스토리 뷰
ViewSet 클래스는 read 또는 update 같은 opertaions만 지원하고 get 또는 put 같은 메소드 핸들러를 지원하지 않는 점을 제외하고는 View와 거의 똑같다.
ViewSet 클래스는 일반적으로 ViewSet이 view들의 세트 안으로 instantiated되지는 마지막 단계, 즉 Router 클래스가 복잡하게 정의된 URL 설정을 핸들링하기위해 사용되어지는 순간 메소드 핸들러의 세트를 bound 한다.
from rest_framework import viewsets
class UserViewSet(viewsets.ReadOnlyModelViewSet):
"""
This viewset automatically provides `list` and `detail` actions.
"""
queryset = User.objects.all()
serializer_class = UserSerializer
ReadOnlyModelViewSet은 기본적으로 자동으로 read-only operation을 제공.
from rest_framework.decorators import action
from rest_framework.response import Response
class SnippetViewSet(viewsets.ModelViewSet):
"""
This viewset automatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions.
Additionally we also provide an extra `highlight` action.
"""
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly,
IsOwnerOrReadOnly]
@action(detail=True, renderer_classes=[renderers.StaticHTMLRenderer])
def highlight(self, request, *args, **kwargs):
snippet = self.get_object()
return Response(snippet.highlighted)
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
ModelViewSet 클래스는 완전한 읽고 쓰는 operation 세트를 제공.
@action decorator는 custom action을 만들기 위해 사용. 이 데코레이터는 표준으로 제공하는 create/update/delete 형식 외에 custom endpoints를 추가하기 위해 사용.
Binding ViewSets to URLs explicitly
# urls.py
from snippets.views import SnippetViewSet, UserViewSet, api_root
from rest_framework import renderers
snippet_list = SnippetViewSet.as_view({
'get': 'list',
'post': 'create'
})
snippet_detail = SnippetViewSet.as_view({
'get': 'retrieve',
'put': 'update',
'patch': 'partial_update',
'delete': 'destroy'
})
snippet_highlight = SnippetViewSet.as_view({
'get': 'highlight'
}, renderer_classes=[renderers.StaticHTMLRenderer])
user_list = UserViewSet.as_view({
'get': 'list'
})
user_detail = UserViewSet.as_view({
'get': 'retrieve'
})
urlpatterns = format_suffix_patterns([
path('', api_root),
path('snippets/', snippet_list, name='snippet-list'),
path('snippets/<int:pk>/', snippet_detail, name='snippet-detail'),
path('snippets/<int:pk>/highlight/', snippet_highlight, name='snippet-highlight'),
path('users/', user_list, name='user-list'),
path('users/<int:pk>/', user_detail, name='user-detail')
])
Using Routers
ViewSet 클래스를 사용할 때는 위와 같이 URL conf 설정을 할 필요 없음.
Router 클래스를 사용하면 자동으로 알아서 해줌.
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from snippets import views
# Create a router and register our viewsets with ti.
router = DefaultRouter()
router.register(r'snippets', views.SnippetViewSet)
router.register(r'users', views.UserViewSet)
# API endpoints
urlpatterns = [
path('', include(router.urls))
]
Trade-offs between views vs viewsets
class-based views를 사용할지 function based views를 사용할지 같은 개념
상황에 따라 알아서....
'Django' 카테고리의 다른 글
Writing Custom django-admin command (0) | 2019.08.30 |
---|---|
Relationships & Hyperlinked APIs (0) | 2019.08.29 |
REST API Authentication & Permissions (0) | 2019.08.29 |
Rest Framework Views (0) | 2019.08.29 |
Serializer (0) | 2019.08.29 |
최근에 올라온 글
글 보관함