【问题标题】:Retrieving current user inside Serializer Method in Django Rest API在 Django Rest API 的序列化器方法中检索当前用户
【发布时间】:2016-10-29 07:14:07
【问题描述】:

我在 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',...)

我有两个使用这个序列化器的视图:

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)

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

一个视图使用 APIView,另一个使用 genericAPIView。当我从 genericAPIView 请求时,它工作正常。但是当我从 APIView 请求时,它给了我关键错误。使用 APIView 时如何在序列化器方法中检索当前用户?

【问题讨论】:

    标签: python django serialization django-rest-framework


    【解决方案1】:

    由于您在APIView 类中手动实例化UserProfileSerializer 而不传递context,因此会引发KeyError 异常。

    在您的APIView 中实例化UserProfileSerializer 时,您应该在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)
    

    【讨论】:

    • 感谢您的帮助。它解决了这个问题。我没有传递上下文
    猜你喜欢
    • 2022-11-22
    • 2022-11-22
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2015-09-25
    相关资源
    最近更新 更多