9

我想一個URL命名空間添加到我的API的路由器,但是當我做路由器看起來還是對於網址沒有命名空間的Django的REST的架構路由器:如何命名空間URL添加到視圖集中

router = DefaultRouter() 
router.register(r'users', UserViewSet) 
router.register(r'events', EventViewSet) 
router.register(r'comments', CommentViewSet) 

urlpatterns = patterns('apiroot.views', 
         url(r'^', include(router.urls, namespace='api')), 
         ) 

可瀏覽的API尋找url名稱,如​​和'user-detail',而不是'api:user-list',這正是我想要發生的事情。

我假設有一個簡單的辦法解決這個(這似乎是一個相當標準的事情想要做的),但我無法找到在Django的REST的架構文檔的任何解決方案。如果我錯過了文檔中的某些內容,請分享一個鏈接,或者如果我正在接近這個錯誤(例如,「你爲什麼會那樣做,這是不好的做法」或其他),請解釋爲什麼或者什麼是管理api url的正確方法是。謝謝!

回答

4

有一個pull request open for this currently。請隨時加入討論。

+0

真棒! @ readevalprint的拉大部分工作?我想貢獻,但我不想污衊討論,因爲我完全不瞭解情況。你能簡要總結一下還沒有接受拉力的現狀和主要問題嗎? –

+0

主要原因是目前缺乏的測試 - 它增加了新的行爲,我們需要覆蓋它(和自舉測試是一個有點疼痛,所以我們需要體面的嘲弄。) - 我的猜測是在通常情況下,它只是工作™ - 如果它不適用於您,那也是有用的。不要擔心污染討論:加入。:-) –

+2

你能指出最後的解決方案嗎? –

0

這是一個非常古老的問題,並從卡爾頓吉布森目前公認的答案是隻是一個在GitHub上拉請求鏈接。

當搜索使用Django的REST框架路由器與命名空間中的網絡,它首先出現的結果。這似乎是SO關於這個話題的唯一問題。
由於代碼示例中沒有具體的答案,因此我想添加我的解決方案。

讓我們以EventViewSet從OP的答案。對於這個視圖集,應該有一個模型類Event和一個模型串行器EventSerializer
EventSerializer可能看起來像這樣:

class EventSerializer(serializers.HyperlinkedModelSerializer): 
    # any other fields 
    class Meta: 
     model = Event 
     # anything else 
     extra_kwargs = { 
      'url': {'view_name': 'api:event-detail'} 
     } 

即用於HyperlinkedModelSerializer包括url字段的例子。

任何超鏈接的字段等HyperlinkedIdentityFieldHyperlinkedRelatedField,其採取view_name作爲參數應傳遞含的命名空間的正確視圖名,無論是在聲明或通過extra_kwargs
對於假設CommentSerializer(對應於CommentViewSet)它可能看起來像:

class EventSerializer(serializers.HyperlinkedModelSerializer): 
    comments = serializers.HyperlinkedRelatedField(
     many=True, 
     read_only=True, 
     view_name='api:event-detail' 
    )