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

Django REST:如何修改Swagger自动文档中的Lookup ID参数?

解决Swagger文档仍显示pk而非自定义weather_date参数的问题

遇到这种情况很正常,因为ReadOnlyModelViewSet默认使用pk作为检索的lookup字段,Swagger是跟着DRF的视图配置走的,咱们只需要调整视图的几个配置项就能搞定:

  • 第一步:在视图类中指定lookup字段
    在你的ReadOnlyModelViewSet子类里,添加lookup_field属性,指定为你要用的weather_date:

    class WeatherViewSet(viewsets.ReadOnlyModelViewSet):
        queryset = Weather.objects.all()
        serializer_class = WeatherSerializer
        lookup_field = 'weather_date'  # 关键配置,替换默认的pk
        # 如果你的URL参数名和lookup_field不同,还需要加下面这行,这里参数名也是weather_date,可加可不加,但加上更清晰
        lookup_url_kwarg = 'weather_date'
    

    这里要注意,weather_date字段在你的模型里得是唯一的(比如设置了unique=True),不然retrieve方法可能会返回多条记录或者抛出异常,毕竟这个方法是用来获取单条数据的。

  • 第二步:确认路由参数自动匹配
    你用的是DefaultRouter,当视图设置了lookup_field后,DRF会自动把路由里的<pk>替换成<weather_date>,不需要手动修改urls.py里的路由配置,重启服务后路由就会更新。

  • 可选:用Swagger扩展显式定义参数(如果上面的配置没生效)
    如果你用的是drf-spectacular,可以给retrieve方法加上@extend_schema装饰器,显式指定参数:

    from drf_spectacular.utils import extend_schema, OpenApiParameter
    
    class WeatherViewSet(viewsets.ReadOnlyModelViewSet):
        # ... 其他配置 ...
    
        @extend_schema(
            parameters=[
                OpenApiParameter(
                    name='weather_date',
                    type=str,  # 根据你的字段类型调整,比如date类型就用date
                    location=OpenApiParameter.PATH,
                    description='The date of the weather record to retrieve'
                )
            ]
        )
        def retrieve(self, request, weather_date=None):
            # 你的方法逻辑
            pass
    

    这个方法属于兜底方案,一般第一步的配置就足够让Swagger自动识别到自定义参数了。

做完这些之后,重启你的服务,刷新Swagger页面,就能看到文档里的Lookup ID变成weather_date啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:22:10