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
相关产品推荐
相关产品推荐

