Вложенные висеты Django на маршрутизаторе

В моем файле urls.py в некотором приложении у меня есть следующий код:

from rest_framework import routers

from .viewsets import (JournalViewSet, StatisticViewSet, FuelLogViewSet,
                       MoveLogViewSet, RestLogViewSet, WinLogViewSet,
                       GreatfulLogViewSet)


router = routers.DefaultRouter()
router.register(r'journal', JournalViewSet)
router.register(r'journal/statistic', StatisticViewSet)
router.register(r'journal/fuel', FuelLogViewSet)
router.register(r'journal/move', MoveLogViewSet)
router.register(r'journal/rest', RestLogViewSet)
router.register(r'journal/win', WinLogViewSet)
router.register(r'journal/greatful', GreatfulLogViewSet)

urlpatterns = router.urls

Все приведенные выше виевсеты не являются чем-то специфическим, и используют только serializer_class и queryset. Swagger генерирует правильную схему, но DRF говорит, что у меня нет разрешенного метода POST (в viesets у меня на самом деле есть), и когда я пытаюсь открыть url типа 127.0.0.1:8000/journal/win, drf возвращает схему для журнала. Когда регистры не были вложенными, как router.register(r'move', MoveLogViewSet), я получаю все правильно. Я понимаю, что DRF, возможно, не обеспечивает вложенных маршрутов, как у меня. Что мне делать?

Я бы настоятельно рекомендовал вам прочитать о DefaultRouter из DRF.

Потому что второй путь - это lookup поля в DefaultRouter.

journal/fuel/ => {prefix}/{lookup}/[.format]

На ваш вопрос:

from rest_framework import routers

from .viewsets import (JournalViewSet, StatisticViewSet, FuelLogViewSet,
                       MoveLogViewSet, RestLogViewSet, WinLogViewSet,
                       GreatfulLogViewSet)


router = routers.DefaultRouter()
# assessment_router = routers.DefaultRouter()
router.register(r'index', JournalViewSet) # Index 
router.register(r'statistic', StatisticViewSet)
router.register(r'fuel', FuelLogViewSet)
router.register(r'move', MoveLogViewSet)
router.register(r'rest', RestLogViewSet)
router.register(r'win', WinLogViewSet)
router.register(r'greatful', GreatfulLogViewSet)

assessment_router.register(r'dashboard', SnippetViewSet)

urlpatterns = [
    path('journal/', include(router.urls)),
    # path('assessment/', include(assessment_router.urls)),
    # path('admin/', admin.site.urls),
    ]
Вернуться на верх