Django REST Framework POST请求报错“TestData.user必须为User实例”求解
问题原因
你的问题本质是两个配置缺失导致的:
- 序列化器未对必填的
user外键字段做只读声明,校验阶段会判定该字段缺失,直接报错 - 普通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
相关产品推荐
相关产品推荐

