Api root на django остальном фреймворке - PullRequest
0 голосов
/ 14 июля 2020

Я новичок ie в DRF, поэтому мне интересно, есть ли «элегантный» способ добавить больше конечных точек в API Root. У меня есть конечная точка для управления моими пользователями и другая для управления их сообщениями, но на http://localhost: отображаются только профили 8000 / api /. Я ищу некоторые решения, которые подразумевают изменение URL-адреса, но я этого не хочу. Например, моя текущая конечная точка для получения всех сообщений - localhost: 8000 / api / posts, что выглядит нормально. Мне не нужно что-то вроде api / posts / posts или чего-то подобного. Есть ли альтернатива?

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

основной urls.py

urlpatterns = [
    path('docs/', schema_view.with_ui('swagger',
                                         cache_timeout=0), name='schema-swagger-ui'),
    path('admin/', admin.site.urls),
    path('api/', include('profiles.urls')),
    path('api/', include('posts.urls')),
    path('api/', include('comments.urls')),
    path('api/', include('private_messages.urls')),
]

userprofile urls.py

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from rest_framework_simplejwt import views as jwt_views
from .views import UserProfileViewSet

router = DefaultRouter()
router.register('profiles', UserProfileViewSet)

urlpatterns = [
    path('', include(router.urls)),
    path('auth/login', jwt_views.TokenObtainPairView.as_view()),
    path('auth/refresh', jwt_views.TokenRefreshView.as_view()),
]

сообщения urls.py

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import PostViewSet, PostByAuthorViewSet

router = DefaultRouter()
router.register('posts', PostViewSet)

urlpatterns = [
    path('posts-by-author/<author_id>', PostByAuthorViewSet.as_view()),
    path('', include(router.urls))
]

1 Ответ

0 голосов
/ 14 июля 2020

но на http://localhost: 8000 / api / отображаются только профили

Это ожидаемое поведение. Django возвращает первый соответствующий путь из вашего файла конфигурации URL, который в вашем случае является модулем профилей. Ваши повторяющиеся пути api/ игнорируются.

Если вы действительно хотите, чтобы все было в /api, вам нужно будет определить все ваши URL-адреса в базовом файле urls.py. Однако я настоятельно рекомендую вам сохранить текущую структуру и добавить имя модуля к вашим конечным точкам:

urlpatterns = [
    path('docs/', schema_view.with_ui('swagger',
                                         cache_timeout=0), name='schema-swagger-ui'),
    path('admin/', admin.site.urls),
    path('api/profiles/', include('profiles.urls')),
    path('api/posts/', include('posts.urls')),
    path('api/comments/', include('comments.urls')),
    path('api/private_messages/', include('private_messages.urls')),
]

В противном случае ваш urls.py файл может очень быстро испортиться по мере роста вашего проекта.

Если вас беспокоит такой маршрут, как localhost:8000/api/posts/posts, вам следует изменить конфигурацию URL-адреса в приложении posts. Что-то вроде этого, вероятно, подойдет вам лучше:

from django.urls import path
from .views import PostViewSet, PostByAuthorViewSet

urlpatterns = [
    path('by-author/<author_id>', PostByAuthorViewSet.as_view()),
    path('', PostViewSet.as_view())
]

Таким образом, у вас будут маршруты localhost:8000/api/posts/ и localhost:8000/api/posts/by-author/1. В качестве побочного примечания вам, вероятно, следует изучить фильтры , поскольку posts-by-authors звучит как набор просмотра, который можно легко включить в ваш PostViewSet с параметром запроса.

...