2015-08-14 58 views

回答

7

首先,所有ModelViewSet url都有名稱,即使您不明確設置這些名稱。

你可以找出默認的網址是如何在路由器內創建,在文檔:http://www.django-rest-framework.org/api-guide/routers/(見「SimpleRouter」 URL名稱表)

要查看應用程序中的所有可用實際的URL名稱,試着用此實用程序:

def print_url_pattern_names(patterns): 
    """Print a list of urlpattern and their names""" 
    for pat in patterns: 
     if pat.__class__.__name__ == 'RegexURLResolver':   # load patterns from this RegexURLResolver 
      print_url_pattern_names(pat.url_patterns) 
     elif pat.__class__.__name__ == 'RegexURLPattern':   # load name from this RegexURLPattern 
      if pat.name is not None: 
       print '[API-URL] {} \t\t\t-> {}'.format(pat.name, pat.regex.pattern) 

然後,在你的urls.py:

urlpatterns = [ 
    url(r'^', include(router.urls)), 
] 

if settings.DEBUG: 
    print_url_pattern_names(urlpatterns) 

如果你想要的網址是來自您的ModelViewSet's名不同(如在我的情況),你可以將其設置爲「BASE_NAME」在路由器上:

router.register('contents', media_views.MediaViewSet, base_name='contents') 

接下來的事情you'll需求正在擴大HyperlinkedModelSerializer:

from rest_framework import serializers 
# in this sample my object is of type "Media" 
class MediaSerializer(serializers.HyperlinkedModelSerializer): 
    #blablabla 

你必須準備的超鏈接顯示爲串行您的詳細信息視圖,但只有一個必要的步驟可供使用。 That's其中 「VIEW_NAME」 進來:

from rest_framework import serializers 
class MediaSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Media 
     fields = ('url', ...[other fields you want to serialize]) 
     extra_kwargs = { 
      'url': {'view_name': 'contents-detail'} 
     } 
  1. 'URL' 字段是強制性的,以顯示該鏈接。
  2. 使用'extra_kwargs'> view_name,你告訴框架你的詳細視圖的名字是'content-detail'。
  3. 'content-detail'只是我的view的名字。您 需要找出你的(從上面的網址名稱實用程序)

這是從樣品HTTP響應(見URL字段):

enter image description here

+0

這裏要設置'」 contents-detail'作爲url名稱。你需要在'urls.py'中聲明這個URL嗎? –

+0

不需要。如上所述,路由器/ modelViewSet將爲您創建網址:http://www.django-rest-framework.org/api-guide/routers/。但在我個人的情況下,考慮到我希望URL以「內容」而不是「媒體」開頭,我在urls.py上設置了該位置(編輯帖子) – xleon

+1

我刪除了view_name的'extra_kwargs',因爲它不是在'HyperlinkedModelSerializer'中不需要它,它就起作用了。此外,這個答案幫助我得到它的工作:http://stackoverflow.com/a/20553926/1913888。我仍然爲您的答案提供+1。謝謝。 –