Django 休息框架 - self.context 没有请求属性
Django rest framework - self.context doesn't have request attribute
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 ...
我的 api(它使用 authentication_classes
和 permission_classes
)正在使用这个序列化器和 get_current_user
函数总是 returns None
。当我调试它时,我发现 self.context 是空字典,即 {}
。为了确保我也打印了 self.context.keys()
,它仍然是空列表。
我关注了这个话题。
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)
如何在视图集的 list()
方法中创建序列化程序?你应该打电话给
serializer = self.get_serializer(data=request.data)
让你的序列化器上下文自动填充,就像在 default implementation of this method in DRF mixins 中所做的那样,但我觉得你只是手动创建它,就像这样:
serializer = MyModelSerializer(instance)
因此,要解决此问题,您应该调用 get_serializer()
,或将额外的上下文参数传递给序列化器构造函数:
serializer = MyModelSerializer(instance, context={'request': request, ...})
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 ...
我的 api(它使用 authentication_classes
和 permission_classes
)正在使用这个序列化器和 get_current_user
函数总是 returns None
。当我调试它时,我发现 self.context 是空字典,即 {}
。为了确保我也打印了 self.context.keys()
,它仍然是空列表。
我关注了这个话题。
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)
如何在视图集的 list()
方法中创建序列化程序?你应该打电话给
serializer = self.get_serializer(data=request.data)
让你的序列化器上下文自动填充,就像在 default implementation of this method in DRF mixins 中所做的那样,但我觉得你只是手动创建它,就像这样:
serializer = MyModelSerializer(instance)
因此,要解决此问题,您应该调用 get_serializer()
,或将额外的上下文参数传递给序列化器构造函数:
serializer = MyModelSerializer(instance, context={'request': request, ...})