Django rest框架 - self.context没有request属性

Wen*_*ndy 12 django django-context django-rest-framework

class MyModelSerializer(serializers.ModelSerializer):
    field1 = serializers.CharField()
    field2 = serializers.SerializerMethodField('get_awesome_user')

    def get_current_user(self):
        request = self.context.get("request")
        if request and hasattr(request, "user"):
            return request.user
        return None

   def get_awesome_user(self, obj):
       user = self.get_current_user()
       ## use this user object, do some stuff and return the value
       return ...
Run Code Online (Sandbox Code Playgroud)

我的api(使用authentication_classespermission_classes)正在使用这个序列化器,get_current_user函数总是返回None.当我调试它时,我发现self.context是空字典,即{}.双重确定我也打印self.context.keys(),仍然是空列表.

我跟着这个帖子.

获取Model Serializer中的当前用户

PS:我正在使用djangorestframework==3.3.3,Django==1.9.1

编辑:添加视图集代码

class MyModelViewSet(viewsets.ModelViewSet):

    authentication_classes = (SessionAuthentication, BasicAuthentication, TokenAuthentication)
    permission_classes = (IsAuthenticated,)

    def list(self, *args, **kwargs):
         queryset = MyModel.objects.all()
         page = self.paginate_queryset(queryset)
         if page is not None:
             serializer = MyModelSerializer(page, many=True)
             return self.get_paginated_response(serializer.data)

         serializer = MyModelSerializer(queryset, many=True)
         return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

Bor*_*kov 31

如何在viewset的list()方法中创建序列化器?你应该打电话

serializer = self.get_serializer(data=request.data)
Run Code Online (Sandbox Code Playgroud)

让你的序列化程序上下文自动填充,就像在DRF mixins默认实现这个方法一样.但我觉得你只是手动创建它,如下所示:

serializer = MyModelSerializer(instance)
Run Code Online (Sandbox Code Playgroud)

因此,要解决此问题,您应该调用get_serializer()或将额外的上下文参数传递给serializer构造函数:

serializer = MyModelSerializer(instance, context={'request': request, ...})
Run Code Online (Sandbox Code Playgroud)