使用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
相关产品推荐
相关产品推荐

