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

如何为基于drf_yasg+Redoc的Django REST Framework API文档添加查询参数

如何在drf_yasg + Redoc的API文档中添加查询参数说明?

我之前也碰到过这个问题——drf_yasg不会自动识别你手动从query_params里读取的参数,得主动告诉它这些参数的存在才行。这里分享两种实用的解决方法:

方法一:手动用swagger_auto_schema装饰器声明参数

这种方法适合快速给单个接口添加参数说明,不需要额外依赖。

首先导入需要的模块:

from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi

然后给你的list方法加上装饰器,手动定义每个查询参数的信息:

class TechnicalDataViewSet(viewsets.ViewSet):
    """ A simple ViewSet for listing or retrieving machine. """
    permission_classes = [permissions.IsAuthenticated]

    @swagger_auto_schema(
        manual_parameters=[
            openapi.Parameter(
                'id_machine',
                openapi.IN_QUERY,
                description="过滤指定机器ID对应的技术数据",
                type=openapi.TYPE_INTEGER,
                required=False  # 明确标注为可选参数
            ),
            openapi.Parameter(
                'name',
                openapi.IN_QUERY,
                description="按名称精确匹配过滤技术数据",
                type=openapi.TYPE_STRING,
                required=False
            )
        ]
    )
    def list(self, request):
        # 原有业务代码保持不变
        id_machine = self.request.query_params.get('id_machine')
        name = self.request.query_params.get('name')
        queryset = TechnicalData.objects.all()
        if id_machine:
            queryset = queryset.filter(machine__id=id_machine)
        if name:
            queryset = queryset.filter(name=name)
        serializer = TechnicalDataSerializer(queryset, many=True)
        return Response(serializer.data)

    # 你的retrieve方法...

重启服务后,Redoc文档里就会显示这两个可选的查询参数了。

方法二:用Django Filter自动生成参数(更推荐)

如果你的过滤逻辑比较复杂,或者想遵循DRF的规范,用django-filter是更好的选择——它不仅能自动生成文档参数,还能帮你简化过滤逻辑的代码。

步骤1:安装并配置django-filter

先安装依赖:

pip install django-filter

然后在settings.py里添加配置:

INSTALLED_APPS = [
    # 其他已安装的app
    'django_filters',
]

REST_FRAMEWORK = {
    # 其他配置
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
}

步骤2:创建FilterSet类

在你的app里创建一个filters.py(或者直接写在views文件里),定义过滤规则:

import django_filters
from .models import TechnicalData

class TechnicalDataFilter(django_filters.FilterSet):
    # 针对外键machine的id,明确指定字段映射
    id_machine = django_filters.NumberFilter(field_name='machine__id', lookup_expr='exact')
    # 名称过滤,默认是精确匹配,也可以改成icontains实现模糊搜索
    name = django_filters.CharFilter(lookup_expr='exact')

    class Meta:
        model = TechnicalData
        fields = ['id_machine', 'name']

步骤3:在ViewSet中使用FilterSet

修改你的ViewSet,去掉手动处理query_params的代码,改用DRF的过滤机制:

from django_filters.rest_framework import DjangoFilterBackend
from .filters import TechnicalDataFilter

class TechnicalDataViewSet(viewsets.ViewSet):
    """ A simple ViewSet for listing or retrieving machine. """
    permission_classes = [permissions.IsAuthenticated]
    filter_backends = [DjangoFilterBackend]
    filterset_class = TechnicalDataFilter

    def list(self, request):
        queryset = TechnicalData.objects.all()
        # 用DRF内置方法处理过滤,无需自己写if判断
        queryset = self.filter_queryset(queryset)
        serializer = TechnicalDataSerializer(queryset, many=True)
        return Response(serializer.data)

    # 你的retrieve方法...

这样drf_yasg会自动识别FilterSet里的参数,在Redoc文档里展示每个参数的类型、描述,而且你的过滤逻辑代码也更简洁易维护。

内容的提问来源于stack exchange,提问作者darkvodka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:32:44