Настройка простых API Django ViewSet из нескольких приложений

Я все еще изучаю django и предполагаю, что это может быть легко для некоторых. Я пытаюсь понять, как лучше всего просто настроить URL API (и чтобы все они отображались в корне api и могли быть использованы в проекте - в моем случае в /api/). Я использую django rest framework, и не могу настроить более одного API - он работает только для одного, но проблема возникает при попытке настроить другой.

Итак, у меня есть приложение под названием pages и accountscore - по умолчанию, где находится основной urls.py). Я создал еще один urls.py внутри приложения pages и еще один внутри приложения accounts.

accounts/urls.py:

from . import views
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r"accounts", views.AccountsViewSet, basename="accounts")
urlpatterns = router.urls

pages/urls.py:

from . import views
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r"pages", views.PagesViewSet, basename="pages")
urlpatterns = router.urls

И ядро urls.py:

from django.contrib import admin
from django.urls import path, include
from rest_framework import routers
from rest_framework.routers import DefaultRouter

router = routers.DefaultRouter()

urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/", include("pages.urls")), # works but root only shows pages API
    # path("api/", include("pages.urls", "accounts.urls")), # fails with error: “django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.”
    # path("api/", include(router.urls)), # no error but root api is empty
]

Я предполагаю, возможно ошибочно, что просто router.urls должен включать все apis при посещении корня. В настоящее время корневой apis выглядит следующим образом при использовании только include("pages.urls”):

{
    "pages": "http://localhost:8000/api/pages/"
}

Как заставить его корректно показывать все apis? Единственный способ, которым я смог это сделать, это вставить router.register(r"accounts", views.AccountsViewSet, basename="accounts”) в страницы urls.py, что очень нежелательно, особенно по мере дальнейшего роста проекта.

Спасибо

Пробовали ли вы использовать:

    path("api/pages/", include("pages.urls")),
    path("api/accounts/", include("accounts.urls")),

В вашем urls.py?

Возможно, это означает, что ваши маршруты будут следующими:

{
     "pages": "http://localhost:8000/api/pages/pages/"
     "accounts": "http://localhost:8000/api/accounts/accounts/"
}

В этом случае вы можете попробовать использовать

router.register("", views.AccountsViewSet, basename="accounts")

в accounts/urls.py.

И аналогично,

router.register("", views.AccountsViewSet, basename="pages")

в pages/urls.py.

Таким образом, вы можете достичь маршрутов типа:

{
     "pages": "http://localhost:8000/api/pages/"
     "accounts": "http://localhost:8000/api/accounts/"
}

если это то, чего вы хотите.

Вернуться на верх