从另一个视图调用 ViewSet 方法

Flo*_*uin 6 django django-rest-framework

我有一个带有 Django REST framework API 的移动应用程序,我有很多 ModelViewSet 可以调用来检索数据。我有性能问题,因为我需要在用户登录后调用很多路由,我想保留 REST 逻辑,但在登录后返回登录响应中的所有视图集内容(保留它们的过滤器)。

是否可以从另一个视图(视图集或 APIView)调用 ModelViewset list()?

我在 SO 上找到的唯一答案是做这样的事情

class ContentGenerator(APIView):

    def get(self, request, format=None):
         data = MyModelViewSet.as_view({'get': 'list'})(request).data

         return Response({'data': data})
Run Code Online (Sandbox Code Playgroud)

但是不支持

Exception Value: The `request` argument must be an instance of `django.http.HttpRequest`, not `rest_framework.request.Request`
Run Code Online (Sandbox Code Playgroud)

还有其他解决方案吗?

Flo*_*uin 8

经过一些研究,看起来在其他视图中重用请求可能会产生副作用,因此 DRF 并未正式支持它。这很hacky,但如果您知道自己在做什么,这是一个解决方案。

data = MyModelViewSet.as_view({'get': 'list'})(request._request).data
Run Code Online (Sandbox Code Playgroud)

  • 注意事项:这似乎适用于 `GET` 请求,但对于 `POST`,我收到此错误:`django.http.request.RawPostDataException: You cannot access body after reading from request's data stream`。 (3认同)