我想在我的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字段之前,序列化程序仅返回id
和name
,这是当时正确和预期的行为。
当我去/ 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.
根据这一线索,我设置的参数在FranchiseListSerializer
的url
领域,据我可以说,他们是正确的。我已检查并重新检查了DRF文档here,here和here,但没有找到解决方案。
继#2等类似的问题,我试图改变view_name='franchise_details'
到view_name='api:franchise_details'
(Django的名称应用程序中的相关文件中)和view_name='api:franchise_details-detail'
,但无济于事。
任何和所有的帮助表示赞赏,欢呼声。
在url中你有view_name''db_franchise_details'',但是在序列化程序中你有''franchise_details''因此不匹配。 – AKS
啊,文件似乎说,否则,至少我怎么读它。干杯 – 99lives