【问题标题】:Define POST in coreapi/django rest framework在 coreapi/django rest 框架中定义 POST
【发布时间】:2018-08-18 03:18:45
【问题描述】:

有没有办法在django rest框架的schema中为post函数定义对象?

我有一个rest api视图:

class DocumentView(viewsets.ModelViewSet):
    ...
    queryset = Document.objects.all().order_by('pk')
    serializer_class = serializers.DocumentSerializer
    pagination_class = LargeResultPagination
    permission_classes = (IsAuthenticated,)
    authentication_class = (
        Token,
    )

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)  

应发布的数据格式为:

{
     "items": ["a", "b", "c"],
     "name": "test" 
}

如何使用 coreapi 在架构中描述它?

manual_fields=[
        coreapi.Field(
            "data",
            required=True,
            location="body",
            description='{"items":[], "name":str}',
            schema=coreschema.Object()
        ),
    ])

所以至少它会在描述中。这当然不是很方便,尤其是 igf 你需要在要发布的 JSON 中有更多的字段,因为描述是单行的,只有在 swagger 中。

最理想的情况是,如果我可以在 swagger 页面中将“items”和“name”字段作为单独的字段。

我用谷歌搜索过,但我找不到答案。我看到的所有示例都是用于获取参数的。那么这里的最佳做法是什么?

【问题讨论】:

  • 有没有办法将此 JSON 作为 POST API 中正文的示例值?

标签: python django django-rest-framework core-api


【解决方案1】:

这个问题已经很久了,但是如果有人需要,这是您的解决方案,您需要将位置设置为“表单”,因此您的架构将是这样的:

manual_fields=[
    coreapi.Field(
        "data",
        required=True,
        location="form",
        description='{"items":[], "name":str}',
        schema=coreschema.Object()
    ),
])

更多说明可以看Schemas - Django Rest Framework

这里我提取你需要的部分:

位置

确定如何将信息编码到请求中。应该 以下字符串之一:

“路径”

包含在模板化 URI 中。例如一个 url 值 /products/{product_code}/ 可以与“路径”字段一起使用, 处理 URL 路径中的 API 输入,例如 /products/slim-fit-jeans/。

这些字段通常与 项目 URL 配置。

“查询”

作为 URL 查询参数包含在内。例如 ?search=sale。通常 用于 GET 请求。

这些字段通常与分页和过滤相对应 视图上的控件。

“表格”

包含在请求正文中,作为 JSON 对象的单个项目或 HTML 表单。例如 {"color": "blue", ...}。通常对于 POST, PUT 和 PATCH 请求。多个“表单”字段可以包含在一个 单个链接。

这些字段通常与序列化器字段对应 查看。

“身体”

作为完整的请求正文包含在内。通常用于 POST、PUT 和 PATCH 请求。一个链接上不能有超过一个“body”字段。可能 不能与“表单”字段一起使用。

这些字段通常对应于使用 ListSerializer 验证请求输入,或与文件上传 意见。

【讨论】:

    【解决方案2】:

    如果你将它包装到 AutoSchema 应该可以工作

    schema = AutoSchema(manual_fields=[
        coreapi.Field(
            "data",
            required=True,
            location="body",
            description='{"items":[], "name":str}',
            schema=coreschema.Object()
        ),
    ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-04
      • 2016-05-03
      • 2021-09-15
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      相关资源
      最近更新 更多