Django REST Framework超链接URL无法解析

时间:2016-04-25 07:10:56

标签: python django rest serialization django-rest-framework

我正在尝试在我的Django REST Framework API中设置超链接,而对于我的生活,我无法找到我的错误。

我的模特:

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 / db / franchise /转到视图franchise_index,后者返回FranchiseListSerializer序列化的数据。
  • URL / api / db / franchise / <franchiseid> /进入视图franchise_details,返回FranchiseDetailSerializer序列化的数据(正常工作)

如您所见,我已将{url}字段添加到FranchiseListSerializer,我应将其链接到相应的特许经营详情页面。在我添加url字段之前,序列化程序仅返回idname,这是当时正确和预期的行为。

当我去/ api / db / franchise /现在,我收到错误:

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.

根据这个提示,我在url的{​​{1}}字段中设置了参数,据我所知,它们是正确的。我已检查并仔细检查了DRF文档,hereherehere,但未找到解决方案。

关于Stackoverflow上的其他类似问题,我尝试将FranchiseListSerializer更改为view_name='franchise_details'(相关文件所在的Django应用程序的名称)和view_name='api:franchise_details',但无济于事。< / p>

欢迎任何和所有帮助,欢呼。

1 个答案:

答案 0 :(得分:0)

感谢@ AKS的承诺,我明白了。 view_name实际上是URL的名称,而不是视图。从我阅读文档的方式(以及它是view_name而不是url_name)的事实来看,似乎它应该是视图的名称。

我之前曾尝试使用view_name='db_franchise_details'(我的网址名称),但这不起作用。在AKS向我发表评论后,我再次尝试,并尝试使用view_name='api:db_franchise_details',这确实有效!