gpt4 book ai didi

django - 在我的 ViewSet 中使用 detail_route 时,在 DRF 序列化程序中收到 'request' 的 KeyError

转载 作者:行者123 更新时间:2023-12-04 15:09:32 32 4
gpt4 key购买 nike

这是我的 View 集:

class PostViewSet(viewsets.ModelViewSet):
serializer_class = PostSerializer
permission_classes = (IsAuthenticated, IsOwnerDeleteOrReadOnly)

def get_queryset(self):
return Post.objects.filter(location=self.request.user.userextended.location)

def perform_create(self, serializer):
serializer.save(owner=self.request.user, location=self.request.user.userextended.location)

def get_serializer_context(self):
"""
Extra context provided to the serializer class.
"""
return {
'format': self.format_kwarg,
'view': self,
'location': self.request.user.userextended.location
}

@detail_route(methods=['post'], permission_classes=[IsAuthenticated, IsFromLocation])
def like(self, request, pk=None):
post = self.get_object()
post.usersVoted.add(request.user)
return Response(status=status.HTTP_204_NO_CONTENT)

@detail_route(methods=['get'], permission_classes=[IsAuthenticated, ValidPostPkInKwargs, IsFromPostLocation])
def replies(self, request, pk=None):
post = self.get_object()
replies = post.postreply_set.all()
serializer = PostReplySerializer(replies, many=True)
return Response(serializer.data)

这是我的 PostReplySerializer:
class PostReplySerializer(serializers.ModelSerializer):
owner = serializers.SlugRelatedField(slug_field='username', read_only=True)
voted = serializers.SerializerMethodField()

def get_voted(self, obj):
return self.context['request'].user in obj.usersVoted.all()

class Meta:
model = PostReply
fields = ('id', 'owner', 'post', 'voted', 'location')

错误指向线
return self.context['request'].user in obj.usersVoted.all()

并说:
KeyError at /URL/20/replies/
'request'

知道为什么 DRF 说“请求”是一个关键错误,即使(根据我的理解)它应该自动在 self.context 中?

请注意 PostViewSet适用于所有其他请求(如果我收到帖子,获取帖子列表等)。它只是不适用于 replies .

最佳答案

它不在 self.context 中,因为您已覆盖 get_serializer_context . request对象通过此方法附加到上下文。只需添加 request: self.request在您的 get_serializer_context 的退货声明中那将解决问题。看看 get_serializer_context 的默认实现这里https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/generics.py了解更多。希望能帮助到你..

编辑
由于您在 detail_route 中使用了不同的序列化程序( PostReplySerializer ),您需要创建类似 serializer = PostReplySerializer(replies, many=True, context={'request': self.request}) 的序列化程序实例

关于django - 在我的 ViewSet 中使用 detail_route 时,在 DRF 序列化程序中收到 'request' 的 KeyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34366608/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com