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

Django中如何将user_id从视图传递到序列化器创建Answer实例

有两种常用的实现方案,你可以根据需求选择:

方案一:重写视图的perform_create方法(推荐,改动最小)

这是DRF官方推荐的补充创建字段的方式,不需要调整序列化器的核心逻辑,直接在你的CreateAnswer视图中新增perform_create方法即可:

from rest_framework.permissions import IsAuthenticated

class CreateAnswer(generics.CreateAPIView):
    # 新增权限校验,保证只有登录用户能提交回答,避免拿不到user.id
    permission_classes = [IsAuthenticated]

    def get_serializer_context(self):
        context = super().get_serializer_context()
        context["id"] = self.request.user.id
        return context
    
    # 新增这段代码即可
    def perform_create(self, serializer):
        # 保存时直接传入当前登录用户的id赋值给user_id字段
        serializer.save(user_id=self.request.user.id)

    serializer_class = AnswerQuestionSerializer
    queryset = Answer.objects.all()

你需要同步调整AnswerQuestionSerializer的user_id字段为只读,避免接口校验要求前端传参:

class AnswerQuestionSerializer(serializers.ModelSerializer):
    # 设置user_id为只读,不需要前端传值
    user_id = serializers.CharField(read_only=True)
    class Meta:
        model = Answer
        fields = ["text", "question_id", "user_id"]

方案二:用你已传递的context参数在序列化器中赋值

如果你想使用已经写到serializer context里的id值,可以直接在序列化器中重写create方法手动赋值:

class AnswerQuestionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Answer
        fields = ["text", "question_id"]
    
    def create(self, validated_data):
        # 从视图传递的context中取用户id
        validated_data["user_id"] = self.context.get("id")
        return super().create(validated_data)

这个方案不需要修改视图代码,但是要注意确保context里确实存在id值,同样需要给视图加登录权限校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:45:03