【发布时间】:2016-04-25 07:10:56
【问题描述】:
我正在尝试在我的 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序列化的数据(工作正常)
如您所见,我在FranchiseListSerializer 中添加了一个url 字段,我应该将其链接到相应的特许经营详情页面。在我添加 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.
根据这个提示,我在FranchiseListSerializer 的url 字段中设置了参数,据我所知,它们是正确的。我检查并仔细检查了 DRF 文档,here、here 和 here,但没有找到解决方案。
根据 Stackoverflow 上的其他类似问题,我尝试将 view_name='franchise_details' 更改为 view_name='api:franchise_details'(相关文件所在的 Django 应用程序的名称)和 view_name='api:franchise_details-detail',但无济于事。
感谢您的任何帮助,干杯。
【问题讨论】:
-
在 urls 中有 view_name
'db_franchise_details'但在序列化程序中有'franchise_details'因此不匹配。 -
啊,文档似乎另有说明,至少我是如何阅读的。干杯
标签: python django rest serialization django-rest-framework