如何复用另一个基于类的APIView中的GET方法
解决DRF视图中复用GET方法的问题
你遇到的AttributeError: 'function' object has no attribute 'get'是因为SomethingList.as_view()返回的是一个视图函数,而不是SomethingList类的实例,所以它没有get属性。要复用现有get方法的逻辑,有两种更合理的方式:
方案一:提取公共逻辑到独立方法(推荐,符合DRY原则)
最干净的做法是把SomethingList中get方法里的自定义操作抽成一个独立的公共方法,然后两个视图都调用这个方法。这样以后修改逻辑只需要改一处,维护成本更低。
修改你的SomethingList类:
class SomethingList(generics.ListCreateAPIView): queryset = Something.objects.all() serializer_class = SomethingSerializer def _handle_custom_get_logic(self): # 把原来get方法里的自定义操作移到这里(比如扫描文件系统文件夹) # 示例: # scan_filesystem_folders() ... def get(self, request, *args, **kwargs): self._handle_custom_get_logic() return super().get(request, *args, **kwargs)
然后在你的遗留视图类中复用这个方法:
from drf_spectacular.utils import extend_schema class SimilarSomethingList(generics.ListAPIView): queryset = Something.objects.all() serializer_class = SomethingSerializer @extend_schema( summary="废弃接口:请使用/api/something替代", deprecated=True, # 标记为废弃,Swagger会自动识别 description="此接口仅为兼容遗留系统保留,新开发请使用标准的/api/something接口" ) def get(self, request, *args, **kwargs): # 调用公共逻辑方法 self._handle_custom_get_logic() return super().get(request, *args, **kwargs) # 复用原视图的公共方法 def _handle_custom_get_logic(self): return SomethingList._handle_custom_get_logic(self)
方案二:实例化原视图类并调用其GET方法
如果不想重构原视图的逻辑,可以直接创建SomethingList的实例,手动设置必要的视图属性后调用其get方法:
from drf_spectacular.utils import extend_schema class SimilarSomethingList(generics.ListAPIView): queryset = Something.objects.all() serializer_class = SomethingSerializer @extend_schema( summary="废弃接口:请使用/api/something替代", deprecated=True ) def get(self, request, *args, **kwargs): # 创建原视图的实例 original_view = SomethingList() # 复制视图所需的核心属性 original_view.request = request original_view.args = args original_view.kwargs = kwargs original_view.queryset = self.queryset original_view.serializer_class = self.serializer_class original_view.format_kwarg = self.format_kwarg # 调用原视图的get方法 return original_view.get(request, *args, **kwargs)
额外说明
- 方案一更推荐,因为它把重复逻辑抽离,让代码更清晰易维护。
- 对于DRF-spectacular的废弃标记,一定要加上
deprecated=True参数,这样Swagger文档会自动给这个接口加上废弃标识,前端开发者一眼就能看到。 - 确保两个视图的
queryset和serializer_class保持一致,避免出现数据不一致的问题。
内容的提问来源于stack exchange,提问作者Rabarberski
相关产品推荐
相关产品推荐

