如何在 drf_yasg 中标记整个 ViewSet?
How to tag whole ViewSet in drf_yasg?
我有以下视图集:
class AuthorViewSet(viewsets.ModelViewSet):
queryset = Author.objects.all()
serializer_class = AuthorSerializer
permission_classes = [permissions.AllowAny]
# note that no methods are overridden
我希望 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)
或者像这样使用 Django 的 @method_decorator
:
@method_decorator(name="list", decorator=swagger_auto_schema(tags=["Authors"]))
class AuthorViewSet(viewsets.ModelViewSet):
# ...
这两个选项都需要繁琐的重复,我想避免。
我也试过实现我自己的装饰器:
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
但效果并不理想。
所以我的问题是如何一次装饰所有的操作方法?
我最终使用了这样的东西:
首先创建自定义自动架构
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
在您的设置文件中添加:
SWAGGER_SETTINGS = {"DEFAULT_AUTO_SCHEMA_CLASS":"path.to.CustomAutoSchema"}
在您看来:
class AuthorViewSet(viewsets.ModelViewSet):
queryset = Author.objects.all()
serializer_class = AuthorSerializer
permission_classes = [permissions.AllowAny]
my_tags = ["Authors"]
我有以下视图集:
class AuthorViewSet(viewsets.ModelViewSet):
queryset = Author.objects.all()
serializer_class = AuthorSerializer
permission_classes = [permissions.AllowAny]
# note that no methods are overridden
我希望 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)
或者像这样使用 Django 的 @method_decorator
:
@method_decorator(name="list", decorator=swagger_auto_schema(tags=["Authors"]))
class AuthorViewSet(viewsets.ModelViewSet):
# ...
这两个选项都需要繁琐的重复,我想避免。
我也试过实现我自己的装饰器:
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
但效果并不理想。
所以我的问题是如何一次装饰所有的操作方法?
我最终使用了这样的东西:
首先创建自定义自动架构
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
在您的设置文件中添加:
SWAGGER_SETTINGS = {"DEFAULT_AUTO_SCHEMA_CLASS":"path.to.CustomAutoSchema"}
在您看来:
class AuthorViewSet(viewsets.ModelViewSet):
queryset = Author.objects.all()
serializer_class = AuthorSerializer
permission_classes = [permissions.AllowAny]
my_tags = ["Authors"]