Django DRF嵌套路由下HyperlinkedIdentityField解析URL报错如何解决
问题原因
- 你通过DRF-extensions注册的嵌套路由,生成的
rest:campaign-detail路由需要两个URL参数:父级账户ID(对应参数名account__id)和活动自身的ID(对应参数名pk)。默认的HyperlinkedIdentityField只会自动传入当前对象的pk参数,缺少父级参数导致URL解析失败。 - 你的
rest/urls.py代码不完整:路由注册代码没有闭合括号,也没有将生成的路由赋值给urlpatterns,导致嵌套路由没有实际生效。 - 三层嵌套的AdGroup路由
parents_query_lookups参数配置错误,参数名需要和上层路由的查询字段对应。
解决方案
第一步:修正路由配置
修改rest/urls.py,补全缺失的代码,修正AdGroup的父级查询参数:
from django.urls import include, path from . import views from rest_framework_extensions.routers import ExtendedSimpleRouter app_name = 'rest' router = ExtendedSimpleRouter() ( router.register(r'accounts', views.AccountViewSet, basename='account') .register(r'campaigns', views.CampaignViewSet, basename='campaign', parents_query_lookups=['account__id']) .register(r'adgroups', views.AdGroupViewSet, basename='adgroup', parents_query_lookups=['campaign__account__id', 'campaign__id']) ) # 补全路由注册 urlpatterns = router.urls
第二步:替换嵌套资源的超链接字段
DRF-extensions提供了专门适配嵌套路由的NestedHyperlinkedIdentityField字段,可以自动读取父级资源的参数生成正确的URL,修改serializers.py:
from rest_framework import serializers from rest_framework_extensions.serializers import NestedHyperlinkedIdentityField from . import models class CampaignSerializer(serializers.ModelSerializer): url = NestedHyperlinkedIdentityField( view_name="rest:campaign-detail", # 配置父级参数映射:路由参数名 => 从当前对象取值的路径 parent_lookup_kwargs={ 'account__id': 'account.id' } ) class Meta: model = models.Campaign fields = '__all__' class AccountSerializer(serializers.HyperlinkedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='rest:account-detail') class Meta: model = models.Account fields = '__all__' class AdGroupSerializer(serializers.ModelSerializer): url = NestedHyperlinkedIdentityField( view_name='rest:adgroup-detail', parent_lookup_kwargs={ 'account__id': 'campaign.account.id', 'campaign__id': 'campaign.id' } ) class Meta: model = models.AdGroup fields = '__all__'
修改完成后重启服务即可正常生成嵌套资源的超链接。
内容的提问来源于stack exchange,提问作者Irfan Rafiq
相关产品推荐
相关产品推荐

