【问题标题】:In Django REST is there a way of setting the key in a RetrieveAPIView, rather than filtering in a ListAPIView?在 Django REST 中有没有办法在 RetrieveAPIView 中设置密钥,而不是在 ListAPIView 中过滤?
【发布时间】:2016-11-28 01:06:39
【问题描述】:

在 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)

【问题讨论】:

  • 对不起,你想达到什么目的?我不明白,为什么要用 RetrieveAPIVeiw 替换 ListAPIView - list 用于集合,retrieve 用于单个集合项。 RetrieveAPIView 在过滤器和序列化器方面的工作方式完全相同。
  • 我正在尝试检索一条记录,即与请求用户对应的一条记录。我可以使用 ListAPIView 实现这一点,但我必须忽略“列表”,所以它很乱。我想使用 RetrieveAPIView 因为它只返回一条记录。但是,问题在于您必须通过 URL 传递 pk。
  • 这就是为什么我想知道是否可以包装视图,在包装器中调用视图并将 pk 设置为请求用户的 pk。
  • 啊,现在我明白了。我认为,创建一个自定义 APIView 可能比乱用现有的 GenericViews 的具体细节更好。

标签: python django django-rest-framework


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-05-21
    • 1970-01-01
    • 2021-10-31
    • 2021-08-26
    • 2021-09-07
    • 2010-12-11
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多