gpt4 book ai didi

Django rest 框架 - 调用另一个基于类的 View

转载 作者:行者123 更新时间:2023-12-04 11:27:32 26 4
gpt4 key购买 nike

我仔细研究了几个类似的帖子(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,)

(afaik,序列化程序的细节不相关,因此被忽略了)。

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

我试过了:

尝试 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 类的 View 的一部分:
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,我的 response = ListAndCreateResource().as_view()(request._request, *args, **kwargs) 返回 403 # 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'})
as_view()是一个函数,当被调用时,返回一个接受请求的函数,*args,**kwargs。所以基本上,类 View 是一个封装的函数 View 。

关于Django rest 框架 - 调用另一个基于类的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51145652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com