Django DRF视图修改Task模型属性代码无法运行问题求助
问题修复方案
现有代码的错误点
- 对象获取逻辑错误:
Task.objects.get(id=task_id)在查询不到对象时会直接抛出DoesNotExist异常,不会返回空值,所以if not obj的判断永远不会触发 - 状态判断逻辑倒置:现有代码判断任务状态为
PENDING时返回“任务非待处理”提示,和预期逻辑完全相反 - 模型方法调用错误:
assign_to_benefactor仅需要接收一个受益方对象作为参数,现有代码传入了视图实例和原有分配的受益方两个错误参数 - 多余的save调用:
assign_to_benefactor方法内部已经执行了self.save(),视图层再次调用属于冗余操作 - 请求方法不合理:修改数据的操作用
GET不符合RESTful规范,容易造成重复提交问题,建议改为POST
修复后的代码
视图层代码
from django.shortcuts import get_object_or_404 class TaskRequest(APIView): permission_classes = [IsBenefactor,] # 修改为POST请求更符合接口规范 def post(self, request, task_id): # 用快捷方法统一处理对象不存在时的404返回逻辑 obj = get_object_or_404(Task, id=task_id) # 修正判断逻辑:非PENDING状态才返回错误提示 if obj.state != obj.TaskStatus.PENDING: data={ 'detail': 'This task is not pending.' } return Response(data , status=status.HTTP_404_NOT_FOUND) else: # 传入当前请求的受益方用户即可,如果Benefactor和User是一对一关联,替换为request.user.benefactor obj.assign_to_benefactor(request.user) data={ 'detail': 'Request sent.' } return Response(data , status=status.HTTP_200_OK)
内容的提问来源于stack exchange,提问作者abolfazlmalekahmadi
相关产品推荐
相关产品推荐

