如何在 drf_yasg 中标记整个 ViewSet?

Lev*_*Lev 2 django django-rest-framework drf-yasg

我有以下视图集:

class AuthorViewSet(viewsets.ModelViewSet):
    queryset = Author.objects.all()
    serializer_class = AuthorSerializer
    permission_classes = [permissions.AllowAny]

    # note that no methods are overridden
Run Code Online (Sandbox Code Playgroud)

我想drf_yasg生成自定义架构,以便所有操作方法都将被标记为Authors.

文档说我的选择是通过声明和使用来装饰每个方法@swagger_auto_schema

class AuthorViewSet(viewsets.ModelViewSet):
    # ...
    @swagger_auto_schema(tags=["Authors"])
    def list(self, request, *args, **kwargs):
        return super().list(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

或者@method_decorator像这样使用 Django :

@method_decorator(name="list", decorator=swagger_auto_schema(tags=["Authors"]))
class AuthorViewSet(viewsets.ModelViewSet):
    # ...
Run Code Online (Sandbox Code Playgroud)

这两个选项都需要我想避免的乏味重复。

我也尝试实现我自己的装饰器:

def decorate_viewset_methods(names, decorator):
    if names == "__all__":
        names = [
            "create",
            "retrieve",
            "update",
            "partial_update",
            "destroy",
            "list",
        ]

    def decorate(cls):
        for name in names:
            method = getattr(cls, name)
            setattr(cls, name, decorator(method))
        return cls

    return decorate
Run Code Online (Sandbox Code Playgroud)

但它并没有完全奏效。

所以我的问题是如何一次装饰所有动作方法?

Apr*_*mus 11

我最终使用了这样的东西:

首先创建自定义自动模式

class CustomAutoSchema(SwaggerAutoSchema):

    def get_tags(self, operation_keys=None):
        tags = self.overrides.get('tags', None) or getattr(self.view, 'my_tags', [])
        if not tags:
            tags = [operation_keys[0]]

        return tags
Run Code Online (Sandbox Code Playgroud)

在您的设置文件中添加:

SWAGGER_SETTINGS = {"DEFAULT_AUTO_SCHEMA_CLASS":"path.to.CustomAutoSchema"}
Run Code Online (Sandbox Code Playgroud)

并在您的视图中:

class AuthorViewSet(viewsets.ModelViewSet):
    queryset = Author.objects.all()
    serializer_class = AuthorSerializer
    permission_classes = [permissions.AllowAny]
    my_tags = ["Authors"]
Run Code Online (Sandbox Code Playgroud)