Django REST Framework中perform_update方法失效问题求助
问题原因及解决方案
核心问题:视图类不支持更新操作
你使用的generics.ListCreateAPIView仅提供**列表查询(GET)和创建资源(POST)**能力,并不处理单个资源的更新请求(PUT/PATCH),因此你定义的perform_update方法根本不会被Django触发执行。
修复步骤
1. 替换视图基类
将LeaveRequestList的基类替换为支持更新操作的组合类,同时保留原有列表、创建功能:
from rest_framework import generics, mixins class LeaveRequestList(mixins.ListModelMixin, mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, generics.GenericAPIView): serializer_class = leave_requestsSerializer lookup_field = 'id' # 替换为你的请假申请模型主键字段(如不是id则修改) def get_queryset(self): queryset = leave_requests.objects.all() location = self.request.query_params.get('location') if location is not None: queryset = queryset.filter(testLocation=location) return queryset # 绑定HTTP方法到对应逻辑 def get(self, request, *args, **kwargs): if 'pk' in kwargs: return self.retrieve(request, *args, **kwargs) return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs) def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) def patch(self, request, *args, **kwargs): return self.partial_update(request, *args, **kwargs)
2. 修正perform_update的实例获取逻辑
原代码中perform_update先获取更新前的serializer.instance,再执行save(),导致邮件内容可能是旧数据。应改为直接使用save()返回的更新后实例:
def perform_update(self, serializer): with transaction.atomic(): try: # 获取更新后的请假申请实例 leave_request = serializer.save() supervisor = leave_request.user.supervisor if supervisor and supervisor.email: self.send_leave_request_email(leave_request, supervisor.email, "Updated Leave Request") except Exception as e: logger.error(f"Error during leave request update: {str(e)}") raise e
3. 配置正确的路由
确保URL路由包含单个资源的更新路径:
from django.urls import path from .views import LeaveRequestList urlpatterns = [ path('leave-requests/', LeaveRequestList.as_view(), name='leave-request-list'), # 单个资源的更新/查询路径 path('leave-requests/<int:pk>/', LeaveRequestList.as_view(), name='leave-request-detail'), ]
额外检查项
- 确认
leave_requestsSerializer未将需要更新的字段标记为read_only - 查看日志中
logger.error输出的具体异常信息,排查邮件发送或数据库操作的潜在问题
内容的提问来源于stack exchange,提问作者user25319994
相关产品推荐
相关产品推荐

