使用Swagger

时间:2019-04-20 09:57:29

标签: django django-rest-framework swagger serializer drf-yasg

我有一个使用Django创建的RESTful API的GET端点。 该端点从URL的查询字符串中读取三个值。查询字符串中的特定参数可能会更改数据(包括额外的字段并略微更改结构),该数据会从此端点的JSON响应中返回。

此端点未直接绑定到单个模型。我的视图是RetrieveAPIView的子类,在视图中,我重写了get_object方法,并执行了一些逻辑来查询多个模型,做出一些决定并返回有序字典。

我的问题如下:

我想使用Swagger记录此端点。我正在使用drf-yasg来生成Swagger文档。我没有为此视图声明序列化程序;因为我在get_object中手动构造了一个有序字典,所以我看不到声明一个字典的目的。我不确定如何使用drf-yasg记录端点。

我只发现了一种记录端点的方法,但是它很丑陋,使我的代码code肿,我想知道是否有更好的方法。

通过声明一个openapi.Response对象,并将该对象提供给@swagger_auto_schema装饰器,Swagger显示了两种可能的响应,但是描述整个响应确实会使我的代码blo肿。以下是当前可用于记录端点的示例:

class View(RetrieveAPIView):

    http_method_names = ['get']

    response_json = {
        'Response if X query parameter is something': {
            'key1': 'string',
            'key3': {
                'key4': 0,
                'key5': 'string',
                'key6': 'string'
            }
        },
        'Response if X query parameter is something else': {
            'key1': 'string',
            'key2': 'string'
        }
    }
    swagger_get_responses = openapi.Response(description='Description for the set of responses',
                                             examples=response_json)

    @swagger_auto_schema(responses={200: swagger_get_responses})
    def get(self, request, *args, **kwargs):
        return super().get(request, args, kwargs)

    def get_object(self):
        // Execute a method on a model that queries other models, performs some logic, and 
        // then returns an ordered dict which is then returned by this function.

是否有更好的方法来解决此问题?是否可以在这里应用更好的Django框架或drf-yasg库的Django设计模式/功能,以帮助我处理多个响应主体?

0 个答案:

没有答案