在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)
答案 0 :(得分:1)
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。