【发布时间】:2021-03-19 14:25:00
【问题描述】:
我很难在另一个 APIVIew 中重用来自现有 APIView 的 get 调用。
我有一个基于类的 DRF 视图:
# in urls.py
path('api/something', views.SomethingList.as_view()),
path('api/similarsomething', views.SomethingList.as_view()), #legacy url
# in views.py
class SomethingList(generics.ListCreateAPIView):
queryset = Something.objects.all()
serializer_class = SomethingSerializer
# override get, because of some required custom action
def get(self, request, *args, **kwargs):
# do some custom actions (scan folder on filesystem)
...
return super().get(request, *args, **kwargs)
上面的视图都提供了get(列表)和post(创建)API接口。如预期。我用 DRF 壮观的信息(此处未显示)对其进行了扩充,以生成我的 swagger 文档。
现在,我定义了另一个(旧版)URL,它应该与上面的 get (list) 调用完全相同。目前,这个旧版 url 还指向 SomethingList。
但是......旧版 URL 不应该提供发布(创建)界面,我想使用 drf-spectacular 将其标记为“已弃用”。所以我想我需要一个单独的类来限制 get() 并添加 @extend_schema 装饰器
所以我想重新使用现有的SomethingList.get 功能如下:
# in urls.py
path('api/something', views.SomethingList.as_view()),
path('api/similarsomething', views.SimilarSomethingList.as_view()), # ! points to new class
# in views.py
class SomethingList(generics.ListCreateAPIView):
...
class SimilarSomethingList(generics.ListAPIView): #ListAPIView only!
@extend_schema(summary="Deprecated and other info..")
def get(self, request, *args, **kwargs):
view = SomethingList.as_view()
return view.get(request, *args, **kwargs)
但是,这不起作用。我得到AttributeError: 'function' object has no attribute 'get'
我尝试了几种变体,但也无法正常工作。
问题:
如何重用来自另一个 APIView 的 get() 调用?应该很简单,所以我可能会忽略一些明显的东西。
【问题讨论】:
-
您是否尝试将
http_method_names属性设置为类视图?像这样的东西:stackoverflow.com/a/31451101/13022138 -
@Kyell:这是一个很好的建议。我从
SomethingList子类化,插入http_method_names = ['get', 'head'],然后添加调用super().get(request, *args, **kwargs)的get(self, request, *args, **kwargs)方法,并添加@extend_schema装饰器。如果您在答案中发表评论,我会支持它 -
非常感谢!
标签: python django-rest-framework