简体   繁体   English

在Django Rest API中的Serializer方法内检索当前用户

[英]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. 一种视图使用API​​View,另一种视图使用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? 使用API​​View时如何在序列化器方法中检索当前用户?

Since you are manually instantiating the UserProfileSerializer in your APIView class without passing the context , KeyError exception gets raised. 既然你手动实例化UserProfileSerializerAPIView类,而没有经过contextKeyError异常被引发。

You should pass the request in context parameter when instantiating the UserProfileSerializer in your APIView . APIView实例化UserProfileSerializer时, requestcontext参数中传递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.

相关问题 如何将当前经过身份验证的用户传递给 django rest 框架序列化程序? - how to pass current authenticated user to django rest framework serializer? Django REST 框架 - 如何在序列化程序中获取当前用户 - Django REST Framework - How to get current user in serializer 如何在 Django Rest 框架序列化程序中获取当前用户 ID - How to get current user id in Django Rest Framework serializer 将序列化器字段分配给当前用户ID,并且“不允许”允许从Django Rest Framework 2.3.13上的BrowsableAPIRenderer对其进行编辑 - Assign a serializer field to current user id and “not” allow to edit it from BrowsableAPIRenderer on Django Rest Framework 2.3.13 编辑序列化程序 Django Rest 中的属性值 - Edit the value of an attribute inside a serializer Django Rest Django Rest API:使用令牌验证将当前用户添加到用户字段 - Django Rest API : Add current User to User Field with Token Auth Django rest框架嵌套序列化器创建方法 - Django rest framework nested serializer create method Django Rest Framwork在序列化器中获得用户 - Django Rest Framwork get user in serializer 嵌套的Django Rest Framework用户模型序列化器 - Django Rest Framework User Model Serializer Nested Django Rest Framework Serializer 方法调用 - Django Rest Framework Serializer Method Calling
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM