如何将用户ID和请求数据传递给序列化器?

Xia*_*iao 4 django django-rest-framework

我有一个支持的项目oauth2_provider.ext.rest_framework.OAuth2Authentication。在请求标头中有一个令牌,用于进行身份验证和标识。我认为在执行创建操作时,不应在请求数据中明确包含用户ID。但是序列化程序需要用户信息才能创建新实例。因此,我在序列化器中包含一个user_id字段,并request.data在验证后将值放入dict中。

好吗?有什么更好的办法吗?

serializers.py

class serializer(serializers.Serializer):
    user = UserSerializer(read_only=True)
    user_id = serializers.UUIDField(write_only=True)
    content = serializers.CharField()
Run Code Online (Sandbox Code Playgroud)

views.py

class CommentList(generics.ListCreateAPIView):
    def create(self, request, *args, **kwargs):
        request.data['user_id'] = request.user.id
        return super(CommentList, self).create(request)
Run Code Online (Sandbox Code Playgroud)

pch*_*uet 6

create(validated_data)在序列化程序中覆盖它更干净:

class CommentSerializer(serializers.Serializer):
    ...

    def create(self, validated_data):
      user = self.context['request'].user
      comment = Comment.objects.create(
         user=user, 
         **validated_data
      )
      return comment
Run Code Online (Sandbox Code Playgroud)

参见http://www.django-rest-framework.org/api-guide/serializers/#saving-instances

然后,您无需自定义视图,只需使用通用视图即可。

  • 我认为Serializer中的`self.request.user`应该是`self.context ['request']。user` (2认同)