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

Django REST Framework调用serializer.save()创建用户出现500内部错误

DRF调用serializer.save()创建用户返回500错误排查方案

可能故障原因

  • Django内置create_user方法参数顺序传递错误,内置方法默认参数顺序为create_user(username, email=None, password=None, **extra_fields),你当前代码将password放在第二个参数、email放在第三个参数,参数错位会触发字段校验失败报错
  • 媒体存储目录权限异常,你使用MultiPartParser接收头像上传,设备重启后可能MEDIA_ROOT对应目录的读写权限被重置,写入头像文件时触发IO错误
  • 数据库状态异常,设备重启后数据库服务未正常启动,或新增的用户模型字段未执行数据库迁移,写入数据时触发数据库层面错误
  • 序列化器取值逻辑错误,cellphone、sex等字段如果请求未传递,你直接用validated_data["key"]硬取会触发KeyError
  • 视图状态码使用错误,校验失败返回304不符合HTTP规范,部分客户端或中间件会对304状态码做特殊处理,也可能引发异常

具体排查解决步骤

  • 第一步先开启Django DEBUG模式,直接调用接口查看500错误的详细栈信息,可直接定位到具体错误类型与出错代码行
  • 修正序列化器create方法的参数传递逻辑,改用关键字参数避免顺序错误,同时用get方法取可选字段防止KeyError:
def create(self, validated_data):
    user = User.objects.create_user(
        username=validated_data["username"],
        email=validated_data["email"],
        password=validated_data["password"],
        cellphone=validated_data.get("cellphone"),
        sex=validated_data.get("sex"),
        first_name=validated_data.get("first_name"),
        last_name=validated_data.get("last_name"),
        profile_image=validated_data.get("profile_image"),
    )
    return user
  • 检查媒体目录权限,确认运行Django服务的用户对settings.MEDIA_ROOT对应的目录有可读可写权限,Linux环境可执行chmod 755 你的媒体目录路径修正权限
  • 检查数据库状态,确认数据库服务正常运行,执行python manage.py showmigrations确认所有模型迁移都已应用,未应用的话执行python manage.py migrate完成迁移
  • 修正视图的错误状态码,参数校验失败应返回400错误,把status=status.HTTP_304_NOT_MODIFIED改为status=status.HTTP_400_BAD_REQUEST
  • 查看控制台打印的request.data输出,确认请求参数包含所有必填字段,没有缺少字段或格式错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:45:05