【问题标题】:Django rest framework - self.context doesn't have request attributeDjango 休息框架 - self.context 没有请求属性
【发布时间】:2016-11-11 21:47:08
【问题描述】:
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_classespermission_classes)正在使用这个序列化程序,get_current_user 函数总是返回 None。当我调试它时,我发现 self.context 是空字典,即{}。再次确定我还打印了self.context.keys(),但它仍然是空列表。

我关注了这个帖子。

Get current user in Model Serializer

PS:我正在使用djangorestframework==3.3.3Django==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)

【问题讨论】:

  • 通常self.context由generics.py:GenericApiView.get_serializer_context()函数填充,由generics.py:GenericApiView.get_serializer()调用,在mixins.py中又在viewset.list()/detail()/create()/delete()/update()开头调用。您能否提供您的 ViewSet 代码,因为它需要了解您正在尝试做什么?
  • @Bob : 在问题细节中添加了视图集代码,请看一下。
  • 抱歉耽搁了。温迪,#some stuff 没有解释太多。如何在视图集的 list() 方法中创建序列化程序?您应该调用serializer = self.get_serializer(data=request.data) 来自动填充您的序列化程序上下文,但我感觉您只是手动创建它,例如serializer = MyModelSerializer(instance)。您应该调用get_serializer(),或者将额外的上下文参数传递给序列化器构造函数:serializer = MyModelSerializer(instance, context={'request': request, ...})
  • @bob 你应该把它写成我认为正确的答案:)
  • @Linovia 我有一位好老师 ;) 此外,我现在正在研究 DRF-Mongoengine,它建立在 DRF 之上。这一切都充满了错误,所以就像 1) 编写一个新的端点 - 2) 看看,失败的地方 - 3) 编写单元测试 - 4) 引入错误修复。尽管如此,我还是设法让我们的 REST Api 启动并运行,使用 mongoengine 的 EmbeddedDocuments 进行深度嵌套的 JSON 比使用 RDBMS 关系或带有自定义验证的 JSONField 方便得多。它现在对我们有用,如果出现问题,我知道如何修复它并修复它。干杯!

标签: django django-rest-framework django-context


【解决方案1】:

如何在视图集的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, ...})

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-10-17
  • 2016-12-30
  • 1970-01-01
  • 2013-04-08
  • 2021-11-26
  • 1970-01-01
相关资源
最近更新 更多