[英]Retrieving current user inside Serializer Method in Django Rest API
I have a serializer for user profiles in Django Rest: 我在Django Rest中有一个用于用户配置文件的序列化程序:
class UserProfileSerializer(serializers.ModelSerializer):
......................
......................
status = serializers.SerializerMethodField()
def get_status(self, obj):
user = self.context['request'].user
if obj.user.userprofile in user.followed_userprofiles_set.all():
return "following"
else:
return "notfollowing"
class Meta:
model = UserProfile
fields = (...., 'status',...)
And I have two views that use this serializer: 我有两个使用此序列化程序的视图:
class Followers(APIView):
def get(self, request, format=None):
#user who follow current user
users = request.user.userprofile.followers.all()
userprofiles= UserProfile.objects.filter(user__in=users)
serializer = UserProfileSerializer(userprofiles, many=True)
return Response(serializer.data)
and 和
class Friends(mixins.ListModelMixin, generics.GenericAPIView):
queryset = UserProfile.objects.all()
serializer_class = UserProfileSerializer
permission_classes = (permissions.IsAuthenticated,)
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def get_queryset(self):
.................
.................
return queryset
One view is using APIView and other is using genericAPIView. 一种视图使用APIView,另一种视图使用genericAPIView。 When i request from genericAPIView, its working properly. 当我从genericAPIView请求时,它可以正常工作。 But when i request from APIView, its giving me key error. 但是当我从APIView请求时,它给了我关键错误。 How to retrieve the current user inside serializer method when APIView is used? 使用APIView时如何在序列化器方法中检索当前用户?
Since you are manually instantiating the UserProfileSerializer
in your APIView
class without passing the context
, KeyError
exception gets raised. 既然你手动实例化UserProfileSerializer
在APIView
类,而没有经过context
, KeyError
异常被引发。
You should pass the request
in context
parameter when instantiating the UserProfileSerializer
in your APIView
. 在APIView
实例化UserProfileSerializer
时, request
在context
参数中传递request
。
class Followers(APIView):
def get(self, request, format=None):
#user who follow current user
users = request.user.userprofile.followers.all()
userprofiles= UserProfile.objects.filter(user__in=users)
context = {'request':request} # prepare serializer context
serializer = UserProfileSerializer(userprofiles, many=True, context=context) # pass context
return Response(serializer.data)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.