일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- dp
- 알고리즘
- BFS
- 백준 #알고리즘 #파이썬 #코딩테스트
- 백준 #파이썬 #알고리즘 #코딩테스트
- 다이나믹프로그래밍
- java #자바 #나동빈
- 프로그래머스 #파이썬 #알고리즘 #코딩테스트
- 프로그래머스 #파이썬 #코딩테스트 #알고리즘
- Dijkstra
- 프로그래머스
- 자바 #java
- java #자바
- css #웹 #생활코딩
- react #리액트 #동빈나
- 투포인터
- 파이썬 #알고리즘 #코딩테스트 #프로그래머스
- 백트랙킹
- 재귀
- css #생활코딩 #웹
- 코딩테스트
- react #리액트 #동빈나 #나동빈 #유튜브강의
- 다익스트라
- DFS
- 백준
- PYTHON
- java #자바 #생활코딩
- 파이썬
- 파이썬 #백준 #알고리즘 #코딩테스트
- java #자바 #동빈나
Archives
- Today
- Total
커리까지
[Django REST framework] 6. ViewSets & Routers 본문
728x90
SMALL
ViewSets 사용하기
restapi > appapi > views.py
- List, Detail을 나누었던 것을 하나로 합쳐서 사용할 수 있다.
class UserViewSet(viewsets.ReadOnlyModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
ReadOnlyModelViewSet
는 list, retrieve 를 함께 사용할 수 있다.
class SnippetViewSet(viewsets.ModelViewSet):
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)
@action
데코레이터는 action을 커스텀 할 수 있다.endpoint가
create
/update
/delete
가 아닌 스타일에 적용할 수 있다.default 응답은
get
이다.post
요청은 다음과 같이methods
를 추가한다.@action(methods=['post'], detail=True) def perform_create(self, serializer): serializer.save(owner=self.request.user)
detail=True
의 뜻- a single object를 보여준다.
detail=False
면 a list of objects을 보여준다.- detail 적는걸 pass해도 같은 결과를 return한다.
url 수정하기
restapi > appapi > urls.py
- 먼저 각각의 요청에 맞는 함수 실행을 연결 시키도록 선언해준다.
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 = [
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'),
]
- url과 연결시킨다.
실행해보기
http://127.0.0.1:8000/snippets/
http://127.0.0.1:8000/snippets/1/
http://127.0.0.1:8000/snippets/1/highlight/
http://127.0.0.1:8000/users/1/
- 모두 잘 작동한다.
Router 사용하기
- URL을 다시 디자인하는건 불편하다.
- 자동으로 연결되도록 router를 사용하자.
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'snippets', SnippetViewSet)
router.register(r'users', UserViewSet)
urlpatterns = [
path('', include(router.urls)),
]
실행해보기
api_root()
로 만들었던 view 없이도 같은 화면을 보여준다.모든 화면이 1차로 연결했던 url처럼 잘 작동한다.
- 알아서 구분해서 연결해준다.
더욱이 urlpatterns 에
format_suffix_patterns
를 다시 선언하지 않아도 url.json으로 하면 json 형식으로 변환해준다.참 좋은 기능이다. 매우 편리하다.
728x90
LIST
'django' 카테고리의 다른 글
response.json() vs json.loads(response.content) (0) | 2022.03.11 |
---|---|
[Django REST framework] 7. 테스트 코드 작성 기본 (0) | 2022.03.06 |
[Django REST framework] 5: Relationships & Hyperlinked APIs (0) | 2022.03.04 |
[Django REST framework] 4. Authentication& Permissions (0) | 2022.03.02 |
[Django REST framework] 3. Class-based Views (0) | 2022.02.28 |
Comments