在Django REST中通过关联字段ID访问API端点的问题
解决通过Cable ID访问对应CableDataSheet的API问题
当前问题的核心是:默认的ModelViewSet详情视图会用CableDataSheet自身的主键(id)来查询数据,而你传入的是关联Cable的ID,自然会返回404。下面提供几种实用的解决方法:
方法一:通过查询参数过滤列表(最简便)
直接修改CableSheets视图集的get_queryset方法,支持通过module参数筛选指定Cable对应的所有数据手册:
# views.py class CableSheets(ModelViewSet): http_method_names = ['get', 'head', 'options'] serializer_class = CableDataSheetSerializer filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] def get_queryset(self): queryset = CableDataSheet.objects.all() # 从查询参数中获取module ID module_id = self.request.query_params.get('module') if module_id: queryset = queryset.filter(module_id=module_id) return queryset
使用方式:访问 http://127.0.0.1:8000/store/cable_datasheets/?module=5,即可获取所有属于Cable 5的CableDataSheet数据。
方法二:自定义路径路由(更符合REST风格的独立端点)
如果希望通过路径参数(如/store/cable_datasheets/module/5/)访问,需要添加自定义路由和视图方法:
1. 修改urls.py添加路由
# urls.py from rest_framework.routers import DefaultRouter from .views import CableSheets router = DefaultRouter() router.register(r'cable_datasheets', CableSheets, basename='cable_datasheet') # 添加自定义路由,支持通过module ID查询 urlpatterns = [ *router.urls, path('cable_datasheets/module/<int:module_id>/', CableSheets.as_view({'get': 'list_by_module'}), name='cable-datasheet-by-module'), ]
2. 在CableSheets视图中添加对应方法
# views.py from rest_framework.response import Response class CableSheets(ModelViewSet): # 原有代码保持不变 http_method_names = ['get', 'head', 'options'] serializer_class = CableDataSheetSerializer filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] def get_queryset(self): return CableDataSheet.objects.all() # 新增方法:根据module ID返回对应数据 def list_by_module(self, request, module_id): queryset = CableDataSheet.objects.filter(module_id=module_id) serializer = self.get_serializer(queryset, many=True) return Response(serializer.data)
使用方式:访问 http://127.0.0.1:8000/store/cable_datasheets/module/5/ 获取目标数据。
方法三:利用现有Cable端点(无需额外开发)
注意到你已经在CableSerializer中嵌套了data_sheets字段,所以可以直接通过Cable的详情端点获取关联的数据手册:
访问 http://127.0.0.1:8000/store/cables/5/,返回的JSON中会包含该Cable对应的所有data_sheets数据,这是最省成本的方案。
内容的提问来源于stack exchange,提问作者Monk
相关产品推荐
相关产品推荐

