【问题标题】:How to re-use GET call of another class-based api view如何重用另一个基于类的 api 视图的 GET 调用
【发布时间】: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


【解决方案1】:

http_method_names 设置为类视图。

class SomethingList(generics.ListCreateAPIView):
    http_method_names = ['get', 'head']

参考:https://stackoverflow.com/a/31451101/13022138

【讨论】:

    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多