Как маршрутизировать к определенным методам набора представлений Django
Я изучил документацию по viewset и router для Django и не могу понять, как настроить маршрут для доступа к методу на viewset.
Например, вот мой urls.py:
from rest_framework.routers import DefaultRouter
from users.views import (UserViewSet, testing)
router = DefaultRouter()
router.register(r"users", UserViewSet, basename="users")
urlpatterns = [
path('testing', testing)
]
А затем вот мой файл views в каталоге пользователя
@csrf_exempt
class UserViewSet:
def create(self):
return JsonResponse({
'the create endpoint'
})
@csrf_exempt
def testing(request):
return JsonResponse({
"title": "My json res"
})
Используя postman, я могу попасть в конечную точку example.com/testing и получить json-ответ с выходом из системы. Однако, когда я пытаюсь зайти на example.com/users/create, я получаю 404. Я думал, что параметр basename
при регистрации набора представлений в маршрутизаторе сгруппирует все методы внутри этого класса под маршрутным путем, а затем все методы станут собственными конечными точками. Может быть, я думаю об этом неправильно? Любая помощь была бы прекрасна, так как я новичок в Django. В основном я работал с Express и Laravel. Спасибо!
В Django Rest Framework метод viewset'а create
выполняется во время POST
запроса к определенному uri. В вашем случае таким uri будет /users
.
Если вы хотите добавить дополнительный метод, срабатывающий при /users/create
, вам нужно использовать декоратор action
:
from rest_framework import viewsets
from rest_framework.response import JsonResponse
class UserViewSet(viewsets.ViewSet):
@action(methods=['GET'], url_path='create')
def my_custom_action(self):
return JsonResponse({
'the create endpoint'
})
Поскольку create
является зарезервированным методом в наборах представлений DRF, вам нужно будет назвать метод как-то иначе (в примере my_custom_action
), и установить параметр url_path
соответствующим образом.
Если вы опустите url_path
, путь по умолчанию будет соответствовать имени метода, например /users/my_custom_action
.
Отметим, что вы не преобразовали свой маршрутизатор в список urlpatterns
, поэтому вы не сможете получить доступ к набору представлений независимо от него.
Для преобразования маршрутизатора:
from rest_framework.routers import DefaultRouter
from users.views import (UserViewSet, testing)
router = DefaultRouter()
router.register(r"users", UserViewSet, basename="users")
urlpatterns = [
path('testing', testing),
*router.urls,
]