如何在drf-yasg中为特定端点屏蔽filterset、ordering相关过滤器展示
针对DRF ViewSet自定义action禁用drf-yasg自动生成的过滤、排序参数
这里提供两种适配不同场景的解决方案:
方案1:仅修改OpenAPI文档展示(不影响实际接口逻辑)
如果只需要隐藏文档里的多余参数,不需要限制接口实际处理过滤/排序请求,可以直接用@swagger_auto_schema装饰器手动覆盖参数配置:
from drf_yasg.utils import swagger_auto_schema from rest_framework.decorators import action from rest_framework.viewsets import ModelViewSet class YourViewSet(ModelViewSet): filterset_fields = ["field1", "field2"] ordering_fields = ["created_at", "updated_at"] @swagger_auto_schema( # 清空自动生成的查询参数列表 manual_parameters=[], query_serializer=None ) @action(methods=["GET"], detail=False, url_path="shortcut-query") def shortcut_query(self, request, *args, **kwargs): # 你的预设过滤逻辑 queryset = self.get_queryset().filter(自定义条件) # 剩余业务逻辑
方案2:同时禁用实际过滤排序功能 + 文档自动生成参数(推荐)
如果要求该接口完全不支持外部传入的过滤、排序参数,优先选择这个方案,从根源上避免文档和实际接口行为不一致:
你可以直接在action装饰器中指定空的filter_backends,drf-yasg检测到该接口没有可用过滤后端,就不会自动生成对应的参数schema,同时接口实际也不会处理过滤排序请求:
from rest_framework.decorators import action from rest_framework.viewsets import ModelViewSet from rest_framework.filters import OrderingFilter from django_filters.rest_framework import DjangoFilterBackend class YourViewSet(ModelViewSet): filter_backends = [DjangoFilterBackend, OrderingFilter] filterset_fields = ["field1", "field2"] ordering_fields = ["created_at", "updated_at"] @action( methods=["GET"], detail=False, url_path="shortcut-query", # 指定该action不使用任何过滤后端 filter_backends=[] ) def shortcut_query(self, request, *args, **kwargs): # 你的预设过滤逻辑 queryset = self.get_queryset().filter(自定义条件) # 剩余业务逻辑
如果你使用的DRF版本不支持在action装饰器中传入视图属性,可以重写get_filter_backends方法实现:
class YourViewSet(ModelViewSet): filter_backends = [DjangoFilterBackend, OrderingFilter] filterset_fields = ["field1", "field2"] ordering_fields = ["created_at", "updated_at"] def get_filter_backends(self): if self.action == "shortcut_query": return [] return super().get_filter_backends() @action(methods=["GET"], detail=False, url_path="shortcut-query") def shortcut_query(self, request, *args, **kwargs): # 业务逻辑
原理说明:drf-yasg生成查询参数的逻辑是读取当前视图上下文的
filter_backends、filterset_fields、ordering_fields属性自动推导,只要让自定义action对应的上下文没有可用的过滤后端,或者手动覆盖swagger的参数配置,就可以避免生成多余的参数。
内容的提问来源于stack exchange,提问作者tu en
相关产品推荐
相关产品推荐

