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

Django新手在DRF中调用存储过程遇视图返回NoneType错误求助

解决Django视图返回NoneType的错误

你的视图函数saveitem触发错误的核心原因是:仅在满足POST请求且存在office_id、sem参数的分支里返回了Response,其他所有情况都没有返回值,导致Django收到NoneType,不符合视图必须返回响应对象的要求。

修复后的代码及说明

views.py 修正版

from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from django.db import connection
from .serializers import Insertserialize

@api_view(['POST'])
def saveitem(request):
    if request.method == "POST":
        # 用序列化器做数据验证,这是DRF的标准流程
        serializer = Insertserialize(data=request.data)
        if serializer.is_valid():
            office_id = serializer.validated_data['office_id']
            sem = serializer.validated_data['sem']
            
            # 用参数化查询避免SQL注入,绝对不要用字符串拼接SQL
            with connection.cursor() as cursor:
                cursor.execute(
                    "select add_clearance_item(%s, %s)",
                    [office_id, sem]
                )
                # 如果存储过程有返回结果,可通过cursor.fetchone()/fetchall()获取
            
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        # 验证失败返回错误信息和400状态码
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    # 非POST请求返回405方法不允许
    return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)

关键修改点

  • 补全所有分支的返回:无论请求方法是否为POST、数据验证是否通过,都确保返回合法的Response对象,彻底解决NoneType问题。
  • 修正序列化器用法:你之前直接给序列化器实例赋值属性的方式是错误的,DRF序列化器需要通过is_valid()验证后,从validated_data中获取清洗后的数据,这样能保证数据符合模型定义的约束。
  • 避免SQL注入:原代码用字符串拼接SQL的方式存在严重安全风险,改用参数化查询(%s作为占位符,参数放在列表中传入),能有效防止SQL注入攻击。

serializers.py 说明

你的序列化器代码本身没问题,只需确保ClearanceInsert模型确实包含office_id和sem两个字段即可。

内容的提问来源于stack exchange,提问作者Aaron Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 14:18:26