我正在尝试在我的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
效果很好。
要点:
franchise_index
,后者返回FranchiseListSerializer
序列化的数据。<franchiseid>
/进入视图franchise_details
,返回FranchiseDetailSerializer
序列化的数据(正常工作)如您所见,我已将{url}字段添加到FranchiseListSerializer
,我应将其链接到相应的特许经营详情页面。在我添加url字段之前,序列化程序仅返回id
和name
,这是当时正确和预期的行为。
当我去/ 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文档,here,here和here,但未找到解决方案。
关于Stackoverflow上的其他类似问题,我尝试将FranchiseListSerializer
更改为view_name='franchise_details'
(相关文件所在的Django应用程序的名称)和view_name='api:franchise_details'
,但无济于事。< / p>
欢迎任何和所有帮助,欢呼。
答案 0 :(得分:0)
感谢@ AKS的承诺,我明白了。 view_name
实际上是URL的名称,而不是视图。从我阅读文档的方式(以及它是view_name
而不是url_name
)的事实来看,似乎它应该是视图的名称。
我之前曾尝试使用view_name='db_franchise_details'
(我的网址名称),但这不起作用。在AKS向我发表评论后,我再次尝试,并尝试使用view_name='api:db_franchise_details'
,这确实有效!