2015-05-03 49 views
3

本質上,根據我添加路由到我的urlpatterns的順序,可瀏覽的API將一次只顯示一個路由器。這裏是我的代碼:DRF Browsable 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

但是簡單地扭轉了我添加的URL的順序:

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根?

回答

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