如何重用另一个基于类的api视图的GET调用

2024-06-01 07:53:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难在另一个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惊人的信息(此处未显示)对其进行了扩充,以生成我的招摇过市文档

现在,我定义了另一个(遗留)URL,它应该与上面的get(list)调用完全相同。目前,这个遗留url还指向SomethingList。 但是旧式URL不应该提供post(create)接口,我想使用drf在swagger中将其标记为“已弃用”。所以我想我需要一个单独的类来限制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()调用?应该很简单,所以我可能忽略了一些显而易见的事情


Tags: pathinpyviewapigetrequestas