如何在 Django REST Framework 中显示查询参数选项 - Swagger

新手上路,请多包涵

这已经困扰我一段时间了。

我的最终目标是在 SwaggerUI 中显示查询参数选项,并为每个查询参数提供一个表单输入。类似于为 POST 提供序列化程序时的显示方式。

我正在使用继承自 GenericViewSet 的视图集,我尝试了以下操作:

  • 提供 filter_fields 属性
  • 提供并设置 filter_backends 属性到 (filters.DjangoFilterBackend,)
  • 提供在我的模块中定义的 filter_class。
  • 覆盖 options 方法提供 [actions][GET] 信息

这里有一个小问题,我没有使用任何模型,所以我认为 DjangoFilterBackend 不会真正帮助我。我正在使用 DjangoRESTFramework 与外部 API 对话,我只是简单地获取 JSON 结果,并将其传递到前端层。

这是我的代码的一个小修改片段,以更好地解释我的问题:

视图.py

 class SomeViewSet(GenericViewSet):
    # Note that I have all of these defined, but I have tried various combinations
    filter_fields = ('query_option_1', 'query_option_2',)
    filter_backeds = (filters.DjangoFilterBackend,)
    filter_class = SomeFilter
    query_metadata = some_dict

    # This works when request is OPTIONS
    def options(self, request, *args, **kwargs):
        if self.metadata_class is None:
            return self.http_method_not_allowed(request, *args, **kwargs)
        data = self.metadata_class().determine_metadata(request, self)
        data['actions']['GET'] = self.query_metadata
        return Response(data, status=status.HTTP_200_OK)

过滤器.py

 class SomeFilter(FilterSet):
    strict = True
    query_option_1 = django_filters.NumberFilter(name='query_option_1')
    query_option_2 = django_filters.NumberFilter(name='query_option_2')

    class Meta:
        fields = ['query_option_1', 'query_option_2']

感谢您的关注,并提前感谢您的回复。

原文由 dajee 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 585
2 个回答

好的,对于那些偶然发现这个问题的人,我已经弄清楚了。这很愚蠢,我因为不知道而感到有点愚蠢,但在我的辩护中,它没有被清楚地记录下来。在 DRF 文档或 Django REST Swagger 存储库中找不到该信息。相反,它是在 django-rest-framework-docs 下找到的,这是 Django REST Swagger 的基础。

要将您的查询参数指定为在您的 SwaggerUI 中显示为表单字段,您只需像这样评论:

 def list(self):
    """
    param1 -- A first parameter
    param2 -- A second parameter
    """
    ...

swagger 将解析您的评论并为 param1 和 param2 放置一个表单输入。以下 -- 是对参数的说明。

原文由 dajee 发布,翻译遵循 CC BY-SA 3.0 许可协议

新招摇

from rest_framework.filters import BaseFilterBackend
import coreapi

class SimpleFilterBackend(BaseFilterBackend):
    def get_schema_fields(self, view):
        return [coreapi.Field(
            name='query',
            location='query',
            required=False,
            type='string'
        )]

class MyViewSet(viewsets.ViewSet):
    filter_backends = (SimpleFilterBackend,)

    def list(self, request, *args, **kwargs):
        # print(request.GET.get('query'))  # Use the query param in your view
        return Response({'hello': 'world'}, status.HTTP_200_OK)

原文由 vadimchin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题