Доступ к данным URL в классе сериализаторов в Django Rest Framework

Я получаю None при доступе к данным запроса.

  • 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

но мне нужен user_id из URL, поэтому я нашел способ доступа к данным через context. так я могу получить доступ к значению в сериализаторе.

  • 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

проблема в том, что я не могу использовать context={'user_id': user_id} с paginator.generate_response. есть ли лучший способ получить данные URL в сериализаторе?

Я получил ответ, как возможно получить context данные в сериализаторах .

  • 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
Вернуться на верх