基本上,根据我将路由添加到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
网址:
然而,简单地颠倒我添加网址的顺序:
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
网址!
当我只使用我已注释掉的include()
行时,会发生同样的事情,列表中的第一个是唯一显示的路由器。此外,无论选择哪个路由器,都不会显示api-auth/
和docs/
网址。无论如何,无需创建我自己的自定义视图就可以获得统一的api根目录吗?
答案 0 :(得分:3)
这与Django REST框架没有任何关系,这是因为Django处理重复的网址。
您正在尝试通过两个不同的视图处理单个URL:DRF路由器索引和djoser根视图。 Django只会显示与找到的搜索模式匹配的第一个视图,这通常是网址模式中包含的第一个网址。
Django REST框架也不会检测到多个可用的路由器,并将它们组合在一起,这听起来像是你希望看到的。即使它可以,djoser doesn't use a router因此DRF无法真正知道包含它。
无论如何都可以获得统一的api根而无需创建我自己的自定义视图吗?
回答主要问题:不,Django REST框架无法自动将这些视图组合在一起。您将需要创建自己的客户视图来处理此问题。