Django REST Framework中使用APIView的post方法如何设置当前user_id?
解决方法
1. 修正views.py中的save调用方式
你当前的serializer.save(user)用了位置参数,而Django REST Framework序列化器的save()方法需要接收关键字参数来传递模型实例所需、但前端未提供的字段值。
修改post方法代码如下:
def post(self, request, format=None): print(request.data) serializer = VideoSerializer(data=request.data) if serializer.is_valid(): # 直接传递user对象(推荐,因为模型中user字段通常是ForeignKey类型) serializer.save(user=request.user) return Response(serializer.data, status=status.HTTP_200_OK) else: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
如果你的模型中存储的是user_id(IntegerField类型),也可以改为serializer.save(user_id=request.user.id),但更推荐直接传递user对象,ORM会自动处理关联逻辑。
2. 调整serializers.py的配置
需要保证序列化器允许通过save()方法传递user字段,同时禁止前端手动传入user值(防止篡改):
假设你的Video模型包含user外键字段,序列化器可按如下编写:
from rest_framework import serializers from .models import Video class VideoSerializer(serializers.ModelSerializer): class Meta: model = Video # 列出业务需要的字段,包含user fields = ['id', 'title', 'video_file', 'user'] # 将user设为只读字段,禁止前端传入该字段的值 read_only_fields = ['user']
如果你的序列化器自定义了create方法,需确保正确使用传递的user参数:
def create(self, validated_data): # 从请求上下文获取当前用户 user = self.context['request'].user video = Video.objects.create(user=user, **validated_data) return video
不过更简单的方式是依赖ModelSerializer的默认行为,只要设置了read_only_fields,save()时传递的user参数会被自动用于创建实例。
错误原因说明
你之前使用serializer.save(user)位置参数的方式,会让序列化器将该参数当成validated_data的一部分,但实际上你需要传递的是额外的模型字段值,必须用关键字参数指定字段名,否则序列化器无法识别该参数对应的模型字段,导致验证失败或创建实例时缺少必要字段,最终返回400错误。
内容的提问来源于stack exchange,提问作者PHILLIPP APETENOK
相关产品推荐
相关产品推荐

