在Django REST中,我有一个ListAPIView,用于根据请求用户获取记录(通常只有一个):

class UserPageView(ListAPIView):
    serializer_class = UserPageSerializer
    def get_queryset(self):
        return User.objects.filter(pk=self.request.user.pk)


因为我只获得一条记录,所以我想知道是否存在一种使用RetrieveAPIView的方法(以实现相同的结果)。通过某种方式包装视图并以将kwargs设置为请求用户的pk进行调用。或者替代重写RetrieveAPIView中的主键,将其设置为请求用户的pk?

更新资料

通过覆盖get_object,可以使用不带URL参数的RetrieveAPIView:

class UserPageView(RetrieveAPIView):
    serializer_class = UserPageSerializer
    def get_object(self):
        return get_object_or_404(User, pk=self.request.user.pk)

最佳答案

ListAPIViewDetailAPIViewGenericAPIViews,带有list-detail-create-update-delete mixed-in的标准实现。我认为,就您的情况而言,只编写一个自定义APIView比尝试修改这些家伙更简单-它们很难破解,并且可能需要花费几周的时间才能理解DRF的调用图来对其进行调整。

class UserPageView(APIView):
    def get(self, request, format=None):
        user = User.objects.get(pk=self.request.user.pk)
        serializer = UserPageSerializer(data=request.data, context={"user": user})
        return Response(serializer.data)


另请参见:Pass extra arguments to Serializer Class in Django Rest Framework

09-11 17:21