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

使用drf-nested-routers时遭遇Page Not Found错误求助

嘿,我看了你的代码,马上就发现两个问题——一个是导致404的核心原因,另一个是查询集的逻辑漏洞,咱们一步步来解决:

1. 嵌套路由未被注册(404的关键原因)

你已经定义了contact_router这个嵌套路由,但在api_urlpatterns里只引入了主路由router.urls,完全没把嵌套路由的URL规则加进去!这就导致Django根本不知道/api/contacts/<pk>/phone_number/这个路径对应的处理逻辑,自然返回404。

修改后的app/urls.py

把嵌套路由的URL也加入到api_urlpatterns中,同时建议统一用path替代url(更符合Django 2.0+的规范):

from rest_framework_nested import routers
from contacts.views import ContactViewSet, ContactPhoneNumberViewSet
from django.urls import path, include
from django.contrib import admin

router = routers.SimpleRouter()
router.register(r'contacts', ContactViewSet, 'contacts')

contact_router = routers.NestedSimpleRouter(router, r'contacts', lookup='contact')
contact_router.register(r'phone_number', ContactPhoneNumberViewSet, base_name='contact-phone-numbers')

api_urlpatterns = [
    path('', include(router.urls)),
    path('', include(contact_router.urls)),  # 这行是核心,必须加上!
]

urlpatterns = [
    path('api/', include(api_urlpatterns)),
    path('admin/', admin.site.urls),
]
2. 修复电话号码查询集的过滤逻辑

就算路由正常了,你当前的ContactPhoneNumberViewSet会返回所有用户的所有电话号码,这显然不符合需求——我们需要的是当前用户下,指定联系人的电话号码。修改contacts/views.py里的get_queryset方法:

class ContactPhoneNumberViewSet(viewsets.ModelViewSet):
    serializer_class = ContactPhoneNumberSerializer
    permission_classes = (IsAuthenticated,)
    
    def get_queryset(self):
        # 从路由参数里拿到目标联系人的pk
        contact_pk = self.kwargs.get('contact_pk')
        # 过滤出属于当前用户、且关联该联系人的电话号码
        # 这里假设ContactPhoneNumber模型有外键字段`contact`关联到Contact,记得根据你的实际模型调整
        return ContactPhoneNumber.objects.filter(
            contact__pk=contact_pk,
            contact__user=self.request.user
        )
验证效果

修改完成后,你就可以正常访问:

  • /api/contacts/<pk>/phone_number/:列出指定联系人下的所有电话号码
  • /api/contacts/<pk>/phone_number/<phone_number_pk>/:查看单个电话号码的详情

内容的提问来源于stack exchange,提问作者Anuj TBE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:03:34