Django Rest框架-调用另一个基于类的视图

2024-01-22

我仔细研究了几个类似的帖子(并且从同一项目中的另一个应用程序调用应用程序的基于类的视图 https://stackoverflow.com/questions/46606247/calling-a-class-based-view-of-an-app-from-another-app-in-same-project看起来很有希望,但不起作用),但有些比较旧,没有一个对我有用。这是我的设置(使用 Django==2.0.6,djangorestframework==3.8.2)

我有一个基本模型(此处简化):

from django.db import models
class Resource(models.Model):
    name = models.CharField(max_length=100, null=False)

我有一个基本端点,我可以在其中列出和创建Resource实例:

from rest_framework import generics, permissions
from myapp.models import Resource
from myapp.serializers import ResourceSerializer

class ListAndCreateResource(generics.ListCreateAPIView):
    queryset = Resource.objects.all()
    serializer_class = ResourceSerializer
    permission_classes = (permissions.IsAuthenticated,)

(据我所知,序列化器的详细信息不相关,因此被忽略)。

无论如何,除了这个基本端点之外,我还有另一个 API 端点,它执行一些操作,但也创建一些Resource过程中的对象。当然,我想利用封装在ListAndCreateResource类,所以我只需要维护一个地方Resource已创建。

我努力了:

尝试1:

class SomeOtherView(generics.CreateAPIView):
    def post(self, request, *args, **kwargs):
        # ... some other functionality...
        # ...
        response = ListAndCreateResource().post(request, *args, **kwargs)
        # ... more functionality...
        return Response({'message': 'ok'})

不幸的是,这对我不起作用。在我的跟踪中,我得到:

  File "/home/projects/venv/lib/python3.5/site-packages/rest_framework/generics.py", line 111, in get_serializer
    kwargs['context'] = self.get_serializer_context()
  File "/home/projects/venv/lib/python3.5/site-packages/rest_framework/generics.py", line 137, in get_serializer_context
    'request': self.request,
AttributeError: 'ListAndCreateResource' object has no attribute 'request'

尝试2: 本次尝试尝试使用as_view方法是所有 Django 基于类的视图的一部分:

class SomeOtherView(generics.CreateAPIView):
    def post(self, request, *args, **kwargs):
        # ... some other functionality...
        # ...
        response = ListAndCreateResource.as_view()(request, *args, **kwargs)
        # ... more functionality...
        return Response({'message': 'ok'})

但这放弃了:

AssertionError: The `request` argument must be an instance of `django.http.HttpRequest`, not `rest_framework.request.Request`

所以我的问题是...有没有一种简单的方法可以做到这一点?我可以访问_request的属性rest_framework.request.Request对象(其类型为django.http.HttpRequest,但我没有 DRF 中包含的任何身份验证详细信息Request对象(事实上,我的ListAndCreateResource如果我使用则返回 403response = ListAndCreateResource().as_view()(request._request, *args, **kwargs)上面的尝试#2)。

提前致谢!


这似乎有点晚了,但以防万一有人想知道。

class SomeOtherView(generics.CreateAPIView):
    def post(self, request, *args, **kwargs):
        # ... some other functionality...
        # ...
        response = ListAndCreateResource.as_view()(request, *args, **kwargs)
        # ... more functionality...
        return Response({'message': 'ok'})

The as_view()是一个函数,调用时返回一个接受请求的函数,*args,**kwargs。所以基本上,类视图是一个封装的函数视图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django Rest框架-调用另一个基于类的视图 的相关文章

随机推荐