如何将用户ID传递给带有请求数据的序列化程序?

时间:2017-03-20 21:50:42

标签: django django-rest-framework

我有一个由oauth2_provider.ext.rest_framework.OAuth2Authentication进行认证的项目。请求标头中有一个用于验证和识别的令牌。我认为在处理创建操作时,我不应该明确地在请求数据中包含用户ID。但序列化程序需要用户信息才能创建新实例。所以我在序列化程序中包含了一个user_id字段,并在验证后将值放入request.data字典中。

好吗?还有更好的办法吗?

serializers.py

class serializer(serializers.Serializer):
    user = UserSerializer(read_only=True)
    user_id = serializers.UUIDField(write_only=True)
    content = serializers.CharField()

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)

1 个答案:

答案 0 :(得分:4)

在序列化程序中覆盖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

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

然后您不需要自定义视图,只需使用通用视图。