django에서 viewset 사용 시 router만 등록해주면 리퀘스트 메소드 맞는 동작을 수행해 준다. 한마디로 url을 일일이 등록할 필요가 없다.
//리퀘스트 메소드 별 호출되는 함수POST -> create
ex) POST http://domain/house
GET -> list
ex) GET http://domain/house
파라메터가 있는 GET -> retrieve
ex) GET http://domain/house/10
파라메터가 있는 PUT -> update
ex) PUT http://domain/house/10
파라메터가 있는 PATCH -> partial_update
ex) PATCH http://domain/house/10
파라메터가 있는 DELETE -> destroy
ex) DELETE http://domain/house/10
- 위와 같이 알고 있었는데 기본으로 partial_update는 false로 되어있다네. 그래서 patch 메소드로 호출하면 에러가 발생함. 사실 update와 partial_update가 별차이점이 없기에 굳이 아래 링크처럼 메소드를 오버라이드까지 해가며 쓸 필요가 있을까 싶다. get, post, put, delete 4개만 써도 충분해 보인다.
- reference: https://tech.serhatteker.com/post/2020-09/enable-partial-update-drf/
url.py 에 viewset router를 등록해 주면 된다.
# url.pyfrom rest_framework import routers
from .views import UsersViewSet
router = routers.SimpleRouter()
router.register('house', UsersViewSet)urlpatterns = router.urls
viewset에 다른 종류의 클래스를 추가하고 싶을 수도 있다. 그러면 viewset에 클래스를 등록하고 url을 등록해 주면 된다.
# url.pyfrom rest_framework import routers
from .views import UsersViewSet, HousesViewSetrouter = routers.SimpleRouter()
router.register('house', UsersViewSet)
router.register('houses/info', HousesViewSet)urlpatterns = router.urls
단, 이때 추가하는 url 이름이 중복되면 404 not found 가 발생한다. url을 인식 못 한다.
# url.pyfrom rest_framework import routers
from .views import UsersViewSet, HousesViewSetrouter = routers.SimpleRouter()
router.register('house', UsersViewSet)# error: 위와 똑같은 house를 url로 쓰면 /info 를 붙여줘도 인식 못 함
router.register('house/info', HousesViewSet)urlpatterns = router.urls