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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:50:19