Django rest framework 如何在django rest中获取请求用户数据到表示函数
我需要访问Django rest framework 如何在django rest中获取请求用户数据到表示函数,django-rest-framework,Django Rest Framework,我需要访问request.user在to_representation函数中,我尝试了self.context['request']但是self.context是空字典。是否有任何方式可以访问request.user或将此数据推送到此函数 def to_representation(self, obj): print(self.context) #output is an empty dictionary {} 更新 class RetrieveView(generics.Retri
request.user
在to_representation
函数中,我尝试了self.context['request']
但是self.context
是空字典。是否有任何方式可以访问request.user
或将此数据推送到此函数
def to_representation(self, obj):
print(self.context)
#output is an empty dictionary {}
更新
class RetrieveView(generics.RetrieveAPIView):
def get(self, request, *args, **kwargs):
uid = kwargs.get('uid')
try:
item = self.model.nodes.get(uid=uid)
except Exception as e:
# error response
serializer = self.serializer_class(item)
return HttpSuccessResponse(SuccessResponse(serializer.data).to_json(), status=status.HTTP_200_OK).send()
class TopicRetrieveView(single_result.RetrieveView):
model = Topic
serializer_class = topic.TopicSerializer
所有代码均来自django rest框架通用视图
serializer\u class
是我们在类定义中设置的属性,或者我们需要重写get\u serializer\u class
函数。它将在此函数中处理:
def get_serializer_class(self):
"""
Return the class to use for the serializer.
Defaults to using `self.serializer_class`.
You may want to override this if you need to provide different
serializations depending on the incoming request.
(Eg. admins get full serialization, others get basic serialization)
"""
assert self.serializer_class is not None, (
"'%s' should either include a `serializer_class` attribute, "
"or override the `get_serializer_class()` method."
% self.__class__.__name__
)
return self.serializer_class
def get_serializer(self, *args, **kwargs):
"""
Return the serializer instance that should be used for validating and
deserializing input, and for serializing output.
"""
serializer_class = self.get_serializer_class()
kwargs['context'] = self.get_serializer_context()
return serializer_class(*args, **kwargs)
get\u serializer\u类
将用于get\u serializer
函数:
def get_serializer_class(self):
"""
Return the class to use for the serializer.
Defaults to using `self.serializer_class`.
You may want to override this if you need to provide different
serializations depending on the incoming request.
(Eg. admins get full serialization, others get basic serialization)
"""
assert self.serializer_class is not None, (
"'%s' should either include a `serializer_class` attribute, "
"or override the `get_serializer_class()` method."
% self.__class__.__name__
)
return self.serializer_class
def get_serializer(self, *args, **kwargs):
"""
Return the serializer instance that should be used for validating and
deserializing input, and for serializing output.
"""
serializer_class = self.get_serializer_class()
kwargs['context'] = self.get_serializer_context()
return serializer_class(*args, **kwargs)
而context
将由get\u serializer\u context
函数填充
def get_serializer_context(self):
"""
Extra context provided to the serializer class.
"""
return {
'request': self.request,
'format': self.format_kwarg,
'view': self
}
所以正确的用法是
serializer=self.get\u serializer(item)
,因为它将使用serializer\u class
对item进行序列化,并使用可能有用的额外信息填充上下文serializer=self.serializer\u类(item)
可用于仅序列化项,而无需更多额外信息 可以在使用序列化程序的位置添加视图实现吗?如果使用rest框架的某个视图,则应该正确设置上下文。所以我猜问题就出在这方面了。@fantairmartin这个更新好吗?多亏了@fantairmartin,我发现了我的错误,我需要使用self.get\u serializer()在self.serializer\u classYes中,我刚刚写了一个关于这个的回复。玩得高兴