【发布时间】: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_classes 和 permission_classes)正在使用这个序列化程序,get_current_user 函数总是返回 None。当我调试它时,我发现 self.context 是空字典,即{}。再次确定我还打印了self.context.keys(),但它仍然是空列表。
我关注了这个帖子。
Get current user in 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)
【问题讨论】:
-
通常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