在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)
最佳答案
ListAPIView
和DetailAPIView
是GenericAPIViews,带有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。