访问Django Rest Framework中序列化程序类中的URL数据



在访问请求的数据时,我得到了None

  • 视图.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
  • 序列化程序.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

但是我需要URL中的user_id,所以我找到了一种通过CCD_ 2访问数据的方法。这样我就可以访问序列化程序中的值。

  • 视图.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)
  • 序列化程序.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数据的答案。

  • 视图.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
  • 分页器.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
})
  • 序列化程序.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

最新更新