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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:35:30