gpt4 book ai didi

flask - JSONAPI:更新关系,包括属性

转载 作者:行者123 更新时间:2023-12-01 22:52:57 25 4
gpt4 key购买 nike

我的SQLAlchemy表中有一个由Marshmallow's nested schema feature生成的嵌套对象。例如,一个articles对象的GET响应将包括一个author(一种User类型)对象以及它。

我知道JSONAPI spec已经允许更新关系。但是,通常我想一次调用就更新其嵌套对象的文章(包含新作者的文章的POST请求将自动创建该作者)。是否可以发出包含尚不存在的关系对象资源的PATCH请求?

因此,不仅如此:

PATCH /articles/1 HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json

{
"data": {
"type": "articles",
"id": "1",
"relationships": {
"author": {
"data": { "type": "people", "id": "1" }
}
}
}
}

如果没有作者,最好传递给它以创建一个新作者(这不是我的实际用例,但是我有类似的现实生活需求):
PATCH /articles/1 HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"data": {
"type": "articles",
"id": "1",
"relationships": {
"author": {
"data": { "type": "people", "id": "1", "attributes": {"name": "new author":, "articles_written": 1} }
}
}
}
}

这是完全可能的,还是关于哪些REST框架可以支持这一点的建议,或者是否完全违反JSON API规范?

最佳答案

使用JSON API规范v1.0无法一次更新多个资源。但是有一些建议可以做到这一点。这两个official extensions都是not supported anymore,旨在支持一次创建,更新或删除多个请求。还有一个打开的请求,它是introduce operations to upcoming JSON API spec v1.2

例如,使用建议的操作[1]一次更新两个资源的请求将如下所示:

PATCH /bulk HTTP/1.1
Host: example.org
Content-Type: application/vnd.api+json

{
"operations": [{
"op": "update",
"ref": {
"type": "articles",
"id": "1"
},
"data": {
"type": "articles",
"id": "1",
"attributes": {
"title": "Updated title of articles 1"
}
}
}, {
"op": "update",
"ref": {
"type": "people",
"id": "2"
},
"data": {
"type": "people",
"id": "2",
"attributes": {
"name": "updated name of author 2"
}
}
}]
}

这将在单个事务中更新ID为 titlearticle1属性和ID为 nameperson资源的 2属性。

在单个事务中更新一对一关系并更新相关资源的请求将如下所示:
PATCH /bulk HTTP/1.1
Host: example.org
Content-Type: application/vnd.api+json

{
"operations": [{
"op": "update",
"ref": {
"type": "articles",
"id": "1",
"relationship": "author"
},
"data": {
"type": "people",
"id": "2"
}
}, {
"op": "update",
"ref": {
"type": "people",
"id": "2"
},
"data": {
"type": "people",
"id": "2",
"attributes": {
"name": "updated name of author 2"
}
}
}]
}

这是一个创建新 person并将其作为 author与ID为 article的现有 1关联的请求:
PATCH /bulk HTTP/1.1
Host: example.org
Content-Type: application/vnd.api+json

{
"operations": [{
"op": "add",
"ref": {
"type": "people"
},
"data": {
"type": "people",
"lid": "a",
"attributes": {
"name": "name of new person"
}
}
}, {
"op": "update",
"ref": {
"type": "articles",
"id": "1",
"relationship": "author"
},
"data": {
"type": "people",
"lid": "a"
}
}]
}

请注意,顺序很重要。必须按服务器顺序执行操作。因此,必须先创建资源,然后才能将其关联到现有资源。为了表达这种关系,我们使用一个本地ID( lid)。

请注意,仅当必须以事务方式执行请求时,才应使用操作。如果每个包含的操作都可以原子执行,则应使用单个请求。

根据 implementation list provided on jsonapi.org,有一些库支持Patch扩展。

更新:JSON API v1.1的候选发布中未包含操作。现在计划用于v1.2。拉取请求的作者 said也是规范的维护者之一,他说“操作现在是最高优先级”。 v1.2的候选发行版(包括Operations)可能会在“最终版本1.1的几个月内发布RC”。

[1]目前仅建议将操作引入JSON API v1.2,但不建议合并。可能会有重大变化。在实施之前阅读 related pull request

关于flask - JSONAPI:更新关系,包括属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50575752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com