Django REST Framework如何配置urlpattern处理外键关联资源更新请求
Django REST Framework外键关联资源路由配置方案
第一步:补充ProjectMaterial详情视图
你当前仅实现了ProjectMaterial的列表视图,要实现单条资源的PUT更新,需要新增详情视图,同时重写查询集方法保证操作的是对应项目下的关联资源,修改views.py代码如下:
from rest_framework import generics from .models import Project, ProjectMaterial from .serializers import ProjectSerializer, ProjectMaterialSerializer # 原有视图保持不变 class ProjectList(generics.ListCreateAPIView): queryset = Project.objects.all() serializer_class = ProjectSerializer class ProjectDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Project.objects.all() serializer_class = ProjectSerializer class ProjectMaterialList(generics.ListCreateAPIView): serializer_class = ProjectMaterialSerializer # 重写查询集,过滤当前项目下的所有材料 def get_queryset(self): return ProjectMaterial.objects.filter(project_id=self.kwargs['project_pk']) # 新增ProjectMaterial详情视图 class ProjectMaterialDetail(generics.RetrieveUpdateDestroyAPIView): serializer_class = ProjectMaterialSerializer # 重写查询集,确保只操作对应项目下的指定材料 def get_queryset(self): return ProjectMaterial.objects.filter(project_id=self.kwargs['project_pk'])
第二步:配置urlpatterns
在你的urls.py中添加嵌套路由规则,示例如下:
from django.urls import path from . import views urlpatterns = [ # 原有项目相关路由保持不变 path('projects/', views.ProjectList.as_view(), name='project-list'), path('projects/<int:pk>/', views.ProjectDetail.as_view(), name='project-detail'), # 新增项目关联材料的嵌套路由 path('projects/<int:project_pk>/materials/', views.ProjectMaterialList.as_view(), name='project-material-list'), path('projects/<int:project_pk>/materials/<int:pk>/', views.ProjectMaterialDetail.as_view(), name='project-material-detail'), ]
请求使用说明
配置完成后,你要修改id为1的Project下id为3的ProjectMaterial的units字段,直接发起PUT请求到地址/projects/1/materials/3/,请求体携带units的新值即可,接口会自动校验该材料是否属于指定项目,避免越权操作。
内容的提问来源于stack exchange,提问作者Wian Spamer
相关产品推荐
相关产品推荐

