如何在类基视图中使用drf-yasg,它是所有其他视图的父视图来生成swagger文档?



我使用drf-yasg为swagger文档,但我使用的BaseView是父类视图为所有其他视图,因此所有HTTP方法是在BaseView中编写的,因此子视图不需要实现这些方法。

问题是,当我将@swagger_auto_schema添加到baseView方法时,它没有看到子属性,而是BaseView的属性为空。

BaseView:

class BaseView(APIView):
model = models.Model
serializer_class = serializers.Serializer
description = ''
id = openapi.Parameter('id', in_=openapi.IN_QUERY, type=openapi.FORMAT_UUID)
@swagger_auto_schema(manual_parameters=[id] ,responses={200: serializer_class},operation_description=description)
def get(self, request, id=None, **kwargs):
....
@swagger_auto_schema(request_body=serializer_class)
def post(self, request, **kwargs):
....

然后我们有这个子视图:

class TestApi(BaseView):
model = test
description = 'This is test api'
serializer_class = TestSerializer

在这个方法中Swagger显示描述和serializer_class的空值,因为它没有看到子值如何解决这个问题,而不必配置每个视图HTTP方法和@swagger_auto_schema?

提前感谢。

  1. 创建一个名为api_docs.py的python文件,并编写所有方法的API视图的描述。

    docs = {"视图名称":{post:你的描述;"列表":"……描述",}}

  2. 之后你必须把这个导入到你的视图中,并添加这个。

    从django.utils.decorators导入method_decorator

    @method_decorator(name="HTTP方法名称,如post put destroy", decorator=swagger_auto_schema(tags=["App name"], operation_description=docs['ViewName']['post']))

  3. 如果你要重写任何方法,那么你必须显式地添加这样的视图

@swagger_auto_schema(tags=["App Name "], operation_description=docs['View Name']['post'])

def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

最新更新