You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 12:54:03