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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:15:52