2016-04-25 65 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',它确实有效!