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_classes
和permission_classes
)正在使用这个序列化器,get_current_user
函数总是返回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)
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)
归档时间: |
|
查看次数: |
7406 次 |
最近记录: |