Search code examples
python-3.xdjangodjango-rest-frameworkdjango-viewsdjango-serializer

access URL data in serializers class in Django Rest Framework


I'm getting None while accessing the data of the request.

  • views.py
def get(self, request, post_id, post_language_id, user_id):
    ...
    paginator = CustomPageNumberPagination()
    response = paginator.generate_response(language_liked_data, PostLanguageLikedSerializer, request)
    return response
  • serializers.py
class PostLanguageLikedSerializer(serializers.ModelSerializer):
    is_following = serializers.SerializerMethodField()
    ...
    class Meta:
        model = PostLanguageLike
        fields = [...,'is_following']
    
    def get_is_following(self, obj):
        # here I'm getting None
        user_id = self.context.get("user_id")
        user_followings = UserFollowing.objects.filter(user_id=user_id, following_user_id=obj.user.id)
        is_following = True if len(user_followings) > 0 else False
        return is_following

but I need user_id from the URL so I found a way to access data through context. so I can access the value in the serializer.

  • views.py
def get(self, request, post_id, post_language_id, user_id):
    ...
    language_liked_data = PostLanguageLike.objects.filter(post_language_id=post_in_lang.id)
    post_language_like_serializer = PostLanguageLikedSerializer(language_liked_data, context={'user_id': user_id}, many=True)
    return Response({"response": True, "return_code": "success", "result": {"liked_users": post_language_like_serializer.data}, "message": success["success"]},  status=200)
  • serializers.py
class PostLanguageLikedSerializer(serializers.ModelSerializer):
    is_following = serializers.SerializerMethodField()
    ...
    class Meta:
        model = PostLanguageLike
        fields = [...,'is_following']
    
    def get_is_following(self, obj):
        # here I want to access URL data.
        user_id = self.context.get("user_id")
        user_followings = UserFollowing.objects.filter(user_id=user_id, following_user_id=obj.user.id)
        is_following = True if len(user_followings) > 0 else False
        return is_following

the issue is I'm not able to use context={'user_id': user_id} with paginator.generate_response is there any better way to get URL data in the serializer?


Solution

  • I got the answer on how to possibly get context data in the serializers.

    • views.py
    paginator = CustomPageNumberPagination()
    page = paginator.paginate_queryset(language_liked_data, request)
    serializer = PostLanguageLikedSerializer(page, context={'user_id': user_id}, many=True)
    response = paginator.get_paginated_response(serializer.data)
    return response
    
    • paginator.py
    def get_paginated_response(self, data):
            # customize your response here "data" = "serializer.data"
            return Response({
                'links': {
                    'next': self.get_next_link(),
                    'previous': self.get_previous_link()
                },
                'count': self.page.paginator.count,
                'results': data
            })
    
    • serializers.py
    class PostLanguageLikedSerializer(serializers.ModelSerializer):
        is_following = serializers.SerializerMethodField()
        ...
        class Meta:
            model = PostLanguageLike
            fields = [...,'is_following']
        
        def get_is_following(self, obj):
            # got context data here
            user_id = self.context.get("user_id")
            user_followings = UserFollowing.objects.filter(user_id=user_id, following_user_id=obj.user.id)
            is_following = True if len(user_followings) > 0 else False
            return is_following