2016-04-25 62 views
1

我想在我的Django REST框架API中設置超鏈接,並且對於我的生活我找不到我的錯誤在哪裏。Django REST框架超鏈接URL無法解析

我的模型:

class Franchise(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=255) 
    # Other fields 

我的串行

class FranchiseListSerializer(serializers.HyperlinkedModelSerializer): 
    url = serializers.HyperlinkedIdentityField(
     view_name='franchise_details', 
     lookup_field='id', 
     lookup_url_kwarg='franchiseid' 
    ) 

    class Meta: 
     model = Franchise 
     fields = ('id', 'name', 'url') 

我的網址:

url(r'^db/franchise/$', views.franchise_index, name='db_franchise_index'), 
url(r'^db/franchise/(?P<franchiseid>[0-9]+)/$', views.franchise_details, name='db_franchise_details') 

注意,這是一個包含URL的conf,我所有的API功能變爲內/ api/url

個我的觀點:

@api_view(['GET']) 
def franchise_index(request, format=None): 
    franchise_list = Franchise.objects.all() 
    serializer = FranchiseListSerializer(franchise_list, many=True, context={'request': request}) 
    return Response(serializer.data) 

@api_view(['GET']) 
def franchise_details(request, franchiseid, format=None): 
    franchise = Franchise.objects.get(id=franchiseid) 
    serializer = FranshiseDetailSerializer(franchise) 
    return Response(serializer.data) 

注意FranshiseDetailSerializer看到上面的工作就好了。

總結:

  • URL/API /分貝/連鎖/轉到視圖franchise_index,它返回由FranchiseListSerializer序列化的數據。
  • URL/API/DB /連鎖/ <franchiseid> /轉到視圖franchise_details,它返回FranchiseDetailSerializer序列數據(正常工作)

正如你可以看到,我添加了一個URL字段FranchiseListSerializer,其中我應該鏈接到相應的特許經營細節頁面。在添加url字段之前,序列化程序僅返回idname,這是當時正確和預期的行爲。

當我去/ API/DB /連鎖/現在,我得到的錯誤:

ImproperlyConfigured at /api/db/franchise/ 
Could not resolve URL for hyperlinked relationship using view name "franchise_details". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field. 

根據這一線索,我設置的參數在FranchiseListSerializerurl領域,據我可以說,他們是正確的。我已檢查並重新檢查了DRF文檔here,herehere,但沒有找到解決方案。

繼#2等類似的問題,我試圖改變view_name='franchise_details'view_name='api:franchise_details'(Django的名稱應用程序中的相關文件中)和view_name='api:franchise_details-detail',但無濟於事。

任何和所有的幫助表示讚賞,歡呼聲。

+0

在url中你有view_name''db_franchise_details'',但是在序列化程序中你有''franchise_details''因此不匹配。 – AKS

+0

啊,文件似乎說,否則,至少我怎麼讀它。乾杯 – 99lives

回答

0

感謝@ AKS的提示,我找到了答案。 view_name實際上是URL的名稱,而不是視圖。從我閱讀文檔的方式(事實上它是view_name而不是url_name),似乎認爲它應該是視圖的名稱。

我實際上曾嘗試過使用view_name='db_franchise_details'(我的網址名稱),但沒有奏效。在AKS向我發表評論之後,我再次嘗試,並嘗試使用view_name='api:db_franchise_details',它確實有效!