2015-05-03 4 views
3

По существу, в зависимости от того, в каком порядке я добавляю свои маршруты к моему urlpatterns, API-интерфейс, доступный для просмотра, будет показывать только один маршрутизатор за раз. Вот мой код:API только для просмотра DRF показывает только один маршрутизатор

urls.py:

from django.conf.urls import url, include 
from rest_framework import routers 

from .views import PlantViewSet 

# url router 
router = routers.DefaultRouter() 
router.register(r'plants', PlantViewSet, base_name='Plants') 

djoser_urls = [url(r'^', include('djoser.urls')), ] 

urlpatterns = [ 
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), 
    url(r'^docs/', include('rest_framework_swagger.urls')), 
    # url(r'^', include(router.urls)), 
    # url(r'^', include('djoser.urls')), 
] + djoser_urls + router.urls 

Это только отображает djoser URLs:

djoser_only

Однако просто изменить порядок, в котором я добавляю URLs:

urls.py:

from django.conf.urls import url, include 
from rest_framework import routers 

from .views import PlantViewSet 

# url router 
router = routers.DefaultRouter() 
router.register(r'plants', PlantViewSet, base_name='Plants') 

djoser_urls = [url(r'^', include('djoser.urls')), ] 

urlpatterns = [ 
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), 
    url(r'^docs/', include('rest_framework_swagger.urls')), 
    # url(r'^', include(router.urls)), 
    # url(r'^', include('djoser.urls')), 
] + router.urls + djoser_urls 

Это отображает только router URL!

router_only

То же самое происходит, когда я просто использовать include() линии я закомментированные, что наступит первым в списке является единственным маршрутизатором, который получает отображается. Кроме того, независимо от того, какой роутер получает подхват, ссылки api-auth/ и docs/ никогда не отображаются. В любом случае, чтобы получить единый корень api без необходимости создания собственного пользовательского представления?

ответ

3

Это не имеет никакого отношения к структуре Django REST, это происходит из-за того, как Django имеет дело с повторяющимися URL-адресами.

Вы пытаетесь обработать один URL-адрес двумя разными видами: указателем маршрутизатора DRF и представлением корня djoser. Django будет отображать только первое представление, соответствующее найденному шаблону поиска, который обычно является первыми URL-адресами, включенными в шаблоны url.

Структура Django REST также не обнаруживает несколько доступных маршрутизаторов и группирует их на одной странице, что звучит так, как вы надеетесь увидеть. Даже если бы это было возможно, djoser doesn't use a router, так что DRF действительно не знал, чтобы включить его.

Есть ли способ получить единый корень api без необходимости создания собственного пользовательского представления?

Таким образом, чтобы ответить на главный вопрос: нет, чтобы структура Django REST не могла автоматически группировать эти представления вместе. Вам нужно будет создать собственное представление клиента, чтобы справиться с этим.

+0

Drat. Ну ладно, спасибо за помощь! – pdeuchler

Смежные вопросы