Django APIView中Try & Except未生效,删除不存在对象时返回500错误而非预期400错误的问题求助
问题分析与修复方案
你遇到的问题是由两个关键错误导致的,咱们一步步拆解并修复:
1. Try块外的查询提前触发异常
你在try代码块之前就执行了lead = Lead.objects.get(id=id),这行代码会在目标对象不存在时直接抛出Lead.DoesNotExist异常,根本没机会进入后续的try-except逻辑,所以你的异常处理完全没生效。
2. Except语句引用了错误的异常类
你写的except lead.DoesNotExist:里的lead是一个实例对象,而正确的异常类应该是模型类Lead的属性——Lead.DoesNotExist。
另外补充一个REST规范的小建议:当请求的资源不存在时,返回404 Not Found(status.HTTP_404_NOT_FOUND)比400 Bad Request更合适,400一般用于请求参数格式错误这类场景。
修正后的完整代码
from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView from leads.models import Lead class ChunksLeadCreate(APIView): def delete(self, request, pk, *args, **kwargs): try: # 将查询逻辑完全放入try块内 lead = Lead.objects.get(id=pk) lead.delete() return Response( {"message": "Deal has been deleted"}, status=status.HTTP_204_NO_CONTENT ) # 引用模型类的异常,而非实例的 except Lead.DoesNotExist: return Response( {"message": "Deal doesn't exist"}, status=status.HTTP_404_NOT_FOUND )
关键改动说明
- 移除了
try块外多余的Lead.objects.get(id=id)调用,确保异常能被try-except捕获 - 将
except lead.DoesNotExist:改为except Lead.DoesNotExist:,使用正确的模型异常类 - 把资源不存在时的状态码改为
HTTP_404_NOT_FOUND,贴合RESTful API的设计规范 - 简化了
if lead.delete()的判断,因为delete()方法总会返回删除计数的元组,无需额外校验,直接执行删除即可
你的URL配置path('lead/<int:pk>', ChunksLeadCreate.as_view()),是正常的,只要视图类继承了APIView就能正确接收pk参数。
内容的提问来源于stack exchange,提问作者Reactoo
相关产品推荐
相关产品推荐

