Django viewset에서 url 멀티 등록 및 이름 중복 문제

sig03
3 min readNov 6, 2022

--

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, HousesViewSet
router = 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, HousesViewSet
router = routers.SimpleRouter()
router.register('house', UsersViewSet)
# error: 위와 똑같은 house를 url로 쓰면 /info 를 붙여줘도 인식 못 함
router.register('house/info', HousesViewSet)
urlpatterns = router.urls

--

--

sig03
sig03

No responses yet