在Django中,有没有一种方法可以在RetrieveAPIView中设置密钥,而不是在ListAPIView中进行过滤?

时间:2016-07-24 17:58:06

标签: python django django-rest-framework

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

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

因为我只得到一条记录,所以我想知道是否有办法使用RetrieveAPIView代替(实现相同的结果)。通过某种方式包装视图并使用设置为请求用户pk的kwargs调用它。或者在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)

1 个答案:

答案 0 :(得分:1)

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

相关问题