Вложенные висеты 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),
]