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

Django REST Framework POST请求报错“TestData.user必须为User实例”求解

问题原因

你的问题本质是两个配置缺失导致的:

  1. 序列化器未对必填的user外键字段做只读声明,校验阶段会判定该字段缺失,直接报错
  2. 普通FBV未配置DRF的 token 认证逻辑,即使请求携带了合法token,request.user仍会是匿名用户,无法绑定外键

解决步骤

1. 修改序列化器配置

给user字段设置为只读,序列化器校验阶段就不会要求请求传该字段,同时你save()时传入的用户会被正常写入:

class TestDataSerializer(serializers.ModelSerializer):
    class Meta:
        model = TestData
        fields = ('id', 'TestSDG', 'user')
        extra_kwargs = {
            'user': {'read_only': True}
        }

2. 调整视图逻辑,添加认证配置

用DRF提供的装饰器替代原生的csrf_exempt,自动处理token解析、请求数据解析,同时保证只有登录用户可调用接口:

# 先导入所需依赖
from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated

# 替换原有视图装饰器和逻辑
@api_view(['GET', 'POST'])
@authentication_classes([TokenAuthentication])
@permission_classes([IsAuthenticated])
def testDataApi(request, id=0):
    if request.method == 'GET':
        testdata = TestData.objects.all()
        testdata_serializer = TestDataSerializer(testdata, many=True)
        return JsonResponse(testdata_serializer.data, safe=False)
    elif request.method == 'POST':
        # api_view 已自动解析请求数据,无需手动调用JSONParser
        testdata_serializer = TestDataSerializer(data=request.data)
        if testdata_serializer.is_valid():
            testdata_serializer.save(user=request.user)
            return JsonResponse("Added Successfully", safe=False)
        # 新增校验失败返回,方便排查参数错误
        return JsonResponse(testdata_serializer.errors, status=400)

3. 确认基础配置

请先确保你的settings.py中已经完成以下配置:

  • INSTALLED_APPS 中已添加 rest_framework 和 rest_framework.authtoken
  • 全局/视图级的认证配置包含 TokenAuthentication

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:27:03