Django rest框架-self.context不';没有请求属性

Django rest框架-self.context不';没有请求属性,django,django-rest-framework,django-context,Django,Django Rest Framework,Django Context,我的api(使用authentication\u classes和permission\u classes)正在使用此序列化程序,get\u current\u user函数始终返回None。调试它时,我发现self.context是空字典,即{}。我还打印了self.context.keys(),但仍然是空列表 我沿着这条线走 注:我使用的是djangorestframework==3.3.3,Django==1.9.1 编辑:添加视图集代码 class MyModelSerializer(

我的api(使用
authentication\u classes
permission\u classes
)正在使用此序列化程序,
get\u current\u user
函数始终返回
None
。调试它时,我发现self.context是空字典,即
{}
。我还打印了
self.context.keys()
,但仍然是空列表

我沿着这条线走

注:我使用的是
djangorestframework==3.3.3
Django==1.9.1

编辑:添加视图集代码

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 ...

如何在视图集的
list()
方法中创建序列化程序?你应该打电话

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)
在中自动填充序列化程序上下文,但我感觉您只是手动创建它,如下所示:

serializer = self.get_serializer(data=request.data)
因此,要解决此问题,您应该调用
get\u serializer()
,或者将额外的上下文参数传递给序列化程序构造函数:

serializer = MyModelSerializer(instance)

通常,self.context由
generics.py:GenericApiView.get\u serializer\u context()
函数填充,该函数由
generics.py:GenericApiView.get\u serializer()
调用,然后在
mixins.py
中的
viewset.list()/detail()/create()/delete()/update()
的开头调用。你能提供你的视图集代码吗?因为它是理解你想做什么所必需的?@Bob:在有问题的细节中添加了视图集代码,请看一看。很抱歉耽搁了。温迪,有些东西解释不了多少。如何在视图集的
list()
方法中创建序列化程序?您应该调用
serializer=self.get\u serializer(data=request.data)
自动填充序列化程序上下文,但我感觉您只是手动创建它,比如,
serializer=MyModelSerializer(instance)
。您应该调用
get_serializer()
,或者将额外的上下文参数传递给序列化程序构造函数:
serializer=MyModelSerializer(实例,context={'request':request,…})
@bob您应该将其作为我认为正确的答案:)@Linovia我有一位好老师;)此外,我现在正在开发DRF Mongoengine,它构建在DRF之上。现在到处都是bug,所以这就像1)编写一个新的端点-2)看,失败了什么-3)编写单元测试-4)引入bug修复。尽管如此,我还是成功地启动并运行了我们的RESTAPI,对于深度嵌套的JSON,使用mongoengine的嵌入式文档要比使用定制验证的RDBMS关系或JSonfield方便得多。它现在正在为我们工作,如果出了问题,我知道如何修复它,修复它。干杯@Boris Burkov你能帮我调查一下吗。这是一个类似的问题,但这里的解决方案对我不起作用。谢谢
serializer = MyModelSerializer(instance, context={'request': request, ...})