You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django DRF嵌套路由下HyperlinkedIdentityField解析URL报错如何解决

问题原因

  1. 你通过DRF-extensions注册的嵌套路由,生成的rest:campaign-detail路由需要两个URL参数:父级账户ID(对应参数名account__id)和活动自身的ID(对应参数名pk)。默认的HyperlinkedIdentityField只会自动传入当前对象的pk参数,缺少父级参数导致URL解析失败。
  2. 你的rest/urls.py代码不完整:路由注册代码没有闭合括号,也没有将生成的路由赋值给urlpatterns,导致嵌套路由没有实际生效。
  3. 三层嵌套的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:57:03