首页 > 解决方案 > Django DRF:批量创建 API 的架构

问题描述

我正在使用 django-rest-framework 来构建支持批量创建/更新的 API。在这些情况下,api 将接受一个对象列表,例如

[
    {"foo":"bar"},
    {"foo":"bar"}
]

如果数据是列表,我用来允许批量 API 的代码只是为序列化程序添加选项 many=True 的一个小修改。就像是:

class FooViewSet(views.ModelViewSet):
    def create(self, request, *args, **kwargs):
        many = isinstance(request.data, list)
        if many:
            serializer = self.get_serializer(data=request.data, many=True)
            serializer.is_valid(raise_exception=True)
            self.perform_bulk_create(serializer)
        else:
            ................

我正在使用drf_yasg生成 api 文档。但问题是生成的模式只检测我的请求主体只是单个模型。是否有任何配置可以使 DRF 模式生成器知道它将接受列表类型?

这是 DRF 生成的架构

{
  "post": {
    "operationId": "foos_create",
    "description": "",
    "parameters": [
      {
        "name": "data",
        "in": "body",
        "required": true,
        "schema": {
          "$ref": "#/definitions/Foo"
        }
      }
    ],
    "responses": {
      "201": {
        "description": "",
        "schema": {
          "$ref": "#/definitions/Foo"
        }
      }
    },
    "tags": [
      "foos"
    ]
  }
}

我的期望是架构将是Foo定义的数组类型

任何帮助将不胜感激。谢谢你的时间。

标签: djangodjango-rest-framework

解决方案


我知道这是很老的帖子,但我遇到了类似的问题,作为 DRF 和 python 的菜鸟,花了一段时间才弄清楚这些东西。我只需要添加一个简单的装饰器。仅供参考,我使用https://github.com/miki725/django-rest-framework-bulk进行批量更新。

@method_decorator(name='perform_bulk_create', decorator=swagger_auto_schema(
    request_body=ContactSerializer(many=True),
    operation_description="post list of contacts"
))

推荐阅读