如何在Django中开发通用API?解决更新删除接口无法识别记录ID的问题
问题根因
当前更新、删除操作无法获取目标记录ID,本质是两个新手最常漏配的问题:
- 路由仅配置了无参数的根访问路径,没有为单条资源操作预留携带ID的URL参数通道,DRF没有渠道从请求中解析目标记录ID
- 序列化接口的返回结果未包含ID字段,前端发起更新、删除请求时根本没有可用的ID值作为参数传递
分步配置调整方案
第一步:补全单资源操作的路由规则
现有仅配置inspections-templates无参路径,仅能支撑列表查询、资源创建操作。需要新增携带主键ID参数的路径,绑定同一个视图类,代码示例:
# urls.py 配置示例 from django.urls import path from . import views urlpatterns = [ # 保留原有无参路径,对应列表、创建接口 path('inspections-templates', views.InspectionTemplateGenericView.as_view()), # 新增带主键参数的路径,对应单条记录的查询、更新、删除接口 path('inspections-templates/<int:pk>', views.InspectionTemplateGenericView.as_view()) ]
说明:路径中的<int:pk>会自动把URL中传递的数字ID,作为参数传给视图,DRF的GenericAPIView会默认读取这个参数值,自动调用get_object()方法定位到数据库里的对应记录,不需要手写参数解析逻辑。
第二步:调整序列化器配置,确保ID字段正常返回
列表接口拿不到ID,是因为序列化器的返回字段列表漏了模型主键ID。只需要在序列化器的fields列表里加上id即可,代码示例:
# 序列化器配置示例 from rest_framework import serializers from .models import InspectionTemplate class InspectionTemplateSerializer(serializers.ModelSerializer): class Meta: model = InspectionTemplate # 确保id字段在返回列表中 fields = ['id', 'template_name', 'template_content', 'create_time']
第三步:对齐视图类的Mixin组合,覆盖全操作能力
你已经导入了generics和mixins模块,但大概率没有把更新、删除对应的Mixin加入视图类继承链,也没有给对应请求方法绑定处理逻辑。参考配置如下:
# views.py 视图配置示例 from rest_framework import generics, mixins from .models import InspectionTemplate from .serializers import InspectionTemplateSerializer class InspectionTemplateGenericView( mixins.ListModelMixin, # 支撑列表查询 mixins.CreateModelMixin, # 支撑资源创建 mixins.RetrieveModelMixin,# 支撑单条记录查询 mixins.UpdateModelMixin, # 支撑PUT/PATCH更新 mixins.DestroyModelMixin, # 支撑DELETE删除 generics.GenericAPIView ): queryset = InspectionTemplate.objects.all() serializer_class = InspectionTemplateSerializer # GET请求处理:带ID参数返回单条记录,无ID参数返回列表 def get(self, request, *args, **kwargs): if 'pk' in kwargs: return self.retrieve(request, *args, **kwargs) return self.list(request, *args, **kwargs) # POST请求处理:创建新资源 def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs) # PUT请求处理:全量更新 def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) # PATCH请求处理:局部更新 def patch(self, request, *args, **kwargs): return self.partial_update(request, *args, **kwargs) # DELETE请求处理:删除单条记录 def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs)
高频踩坑提醒:如果你的URL路径参数命名不是DRF默认的
pk,比如写成了<int:id>,必须在视图类中添加lookup_field = 'id'配置,否则DRF会默认从请求路径中读取名为pk的参数,匹配失败时依然无法定位目标记录。
内容的提问来源于stack exchange,提问作者Dharmendra Kakde
相关产品推荐
相关产品推荐

