DRF Browsable API仅显示一个路由器

时间:2015-05-03 23:51:04

标签: django django-rest-framework django-urls python-3.4

基本上,根据我将路由添加到urlpatterns的顺序,可浏览API一次只显示一个路由器。这是我的代码:

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网址:

djoser_only

然而,简单地颠倒我添加网址的顺序:

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网址!

router_only

当我只使用我已注释掉的include()行时,会发生同样的事情,列表中的第一个是唯一显示的路由器。此外,无论选择哪个路由器,都不会显示api-auth/docs/网址。无论如何,无需创建我自己的自定义视图就可以获得统一的api根目录吗?

1 个答案:

答案 0 :(得分:3)

这与Django REST框架没有任何关系,这是因为Django处理重复的网址。

您正在尝试通过两个不同的视图处理单个URL:DRF路由器索引和djoser根视图。 Django只会显示与找到的搜索模式匹配的第一个视图,这通常是网址模式中包含的第一个网址。

Django REST框架也不会检测到多个可用的路由器,并将它们组合在一起,这听起来像是你希望看到的。即使它可以,djoser doesn't use a router因此DRF无法真正知道包含它。

  

无论如何都可以获得统一的api根而无需创建我自己的自定义视图吗?

回答主要问题:不,Django REST框架无法自动将这些视图组合在一起。您将需要创建自己的客户视图来处理此问题。