Как маршрутизировать к определенным методам набора представлений 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,
]
Вернуться на верх