如何在 Python Eve 中添加到列表类型而不替换旧值
How to add to a list type in Python Eve without replacing old values
我的设置与这个问题中的人非常相似:
How do I update a list data_relation in Python Eve
具有用户资源和列表类型的朋友子资源。
users = {
…
‘friends’: {
'type': 'list’,
'schema': {
'type': 'objectid’,
'data_relation': {
'resource': 'users’
}
}
}
},
但是,当我尝试向好友列表添加新值时,列表中的其他值被新值替换。如何将单个值添加到列表并保留旧值?
GET /users/5522987f893e3902048c55ff
{
"_updated": "Wed, 15 Apr 2015 17:22:07 GMT",
"_created": "Mon, 06 Apr 2015 14:30:23 GMT",
"_id": "5522987f893e3902048c55ff",
"friends": [
"552e9eb0893e391063045edc"
]
}
PATCH /users/5522987f893e3902048c55ff
{"friends": [“550f288d893e390204b0a5ac”]}
RESPONSE:
{
"_updated": "Wed, 15 Apr 2015 19:38:06 GMT",
"_created": "Mon, 06 Apr 2015 14:30:23 GMT",
"_status": "OK",
"_id": "5522987f893e3902048c55ff"
}
GET /users/5522987f893e3902048c55ff
{
"_updated": "Wed, 15 Apr 2015 19:38:06 GMT",
"_created": "Mon, 06 Apr 2015 14:30:23 GMT",
"_id": "5522987f893e3902048c55ff",
"friends": [
"550f288d893e390204b0a5ac"
]
}
我也尝试过 PUT,但它也用新值替换了列表。
编辑:
我刚刚尝试使用 POST.
POST /users/5522987f893e3902048c55ff/friends
{"552e9eb0893e391063045edc"}
RESPONSE:
{
"_status": "ERR",
"_error": {
"message": "The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.",
"code": 404
}
}
和
POST /users/5522987f893e3902048c55ff
{"friends": ["552e9eb0893e391063045edc"]}
RESPONSE:
{
"_status": "ERR",
"_error": {
"message": "The method is not allowed for the requested URL.",
"code": 405
}
}
POST 将允许您将新文档添加到 users
端点。如果它返回 405,那么您很可能需要通过将 POST 方法添加到 RESOURCE_METHODS
列表来启用它,因为默认情况下所有端点都是只读的;请参阅 docs(或者您只能通过将方法添加到本地 resource_methods
来为单个端点启用 POST。)
PATCH 允许替换单个字段(与 PUT 不同,PUT 将替换整个文档)。因此,使用 PATCH,您可以通过 将 替换为新值(在您的情况下为新列表 ObjectIds)来自动更新 friends
列表,但您不能在其中推送一个新的 ObjectId恐怕是现有的清单。
这是我使用的解决方法。这可能不是最有效的方法,但对我有用。
我没有像最初计划的那样拥有一个 users/friends
列表,而是最终为 shares.
创建了一个资源在我的例子中,我想知道与哪些 crystals
共享users.
所以当我查询 crystals/<crystal_id>/shares,
时,我应该得到 crystal.
的 shares
列表
如果将 crystals
替换为 users
并将 shares
替换为 friends.
,我认为您可以将这样的解决方案应用于 users/friends
场景 您可能在你的friends_schema
(我的shares_schema
)里放两个不同的user_id
data_relations。
shares_schema = {
'crystal_id': {
'type': 'objectid',
'required': True,
'data_relation': {
'resource': 'crystals',
'embeddable': True,
},
},
'user_id': {
'type': 'objectid',
'required': True,
'data_relation': {
'resource': 'users',
'embeddable': True,
},
},
}
shares = {
'internal_resource': True,
'schema': shares_schema,
}
crystals_shares = {
'schema': shares_schema,
'url': 'crystals/<regex("[a-f0-9]{24}"):crystal_id>/shares',
'datasource': {'source': 'shares'},
}
我的设置与这个问题中的人非常相似: How do I update a list data_relation in Python Eve 具有用户资源和列表类型的朋友子资源。
users = {
…
‘friends’: {
'type': 'list’,
'schema': {
'type': 'objectid’,
'data_relation': {
'resource': 'users’
}
}
}
},
但是,当我尝试向好友列表添加新值时,列表中的其他值被新值替换。如何将单个值添加到列表并保留旧值?
GET /users/5522987f893e3902048c55ff
{
"_updated": "Wed, 15 Apr 2015 17:22:07 GMT",
"_created": "Mon, 06 Apr 2015 14:30:23 GMT",
"_id": "5522987f893e3902048c55ff",
"friends": [
"552e9eb0893e391063045edc"
]
}
PATCH /users/5522987f893e3902048c55ff
{"friends": [“550f288d893e390204b0a5ac”]}
RESPONSE:
{
"_updated": "Wed, 15 Apr 2015 19:38:06 GMT",
"_created": "Mon, 06 Apr 2015 14:30:23 GMT",
"_status": "OK",
"_id": "5522987f893e3902048c55ff"
}
GET /users/5522987f893e3902048c55ff
{
"_updated": "Wed, 15 Apr 2015 19:38:06 GMT",
"_created": "Mon, 06 Apr 2015 14:30:23 GMT",
"_id": "5522987f893e3902048c55ff",
"friends": [
"550f288d893e390204b0a5ac"
]
}
我也尝试过 PUT,但它也用新值替换了列表。
编辑: 我刚刚尝试使用 POST.
POST /users/5522987f893e3902048c55ff/friends
{"552e9eb0893e391063045edc"}
RESPONSE:
{
"_status": "ERR",
"_error": {
"message": "The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.",
"code": 404
}
}
和
POST /users/5522987f893e3902048c55ff
{"friends": ["552e9eb0893e391063045edc"]}
RESPONSE:
{
"_status": "ERR",
"_error": {
"message": "The method is not allowed for the requested URL.",
"code": 405
}
}
POST 将允许您将新文档添加到 users
端点。如果它返回 405,那么您很可能需要通过将 POST 方法添加到 RESOURCE_METHODS
列表来启用它,因为默认情况下所有端点都是只读的;请参阅 docs(或者您只能通过将方法添加到本地 resource_methods
来为单个端点启用 POST。)
PATCH 允许替换单个字段(与 PUT 不同,PUT 将替换整个文档)。因此,使用 PATCH,您可以通过 将 替换为新值(在您的情况下为新列表 ObjectIds)来自动更新 friends
列表,但您不能在其中推送一个新的 ObjectId恐怕是现有的清单。
这是我使用的解决方法。这可能不是最有效的方法,但对我有用。
我没有像最初计划的那样拥有一个 users/friends
列表,而是最终为 shares.
创建了一个资源在我的例子中,我想知道与哪些 crystals
共享users.
所以当我查询 crystals/<crystal_id>/shares,
时,我应该得到 crystal.
shares
列表
如果将 crystals
替换为 users
并将 shares
替换为 friends.
,我认为您可以将这样的解决方案应用于 users/friends
场景 您可能在你的friends_schema
(我的shares_schema
)里放两个不同的user_id
data_relations。
shares_schema = {
'crystal_id': {
'type': 'objectid',
'required': True,
'data_relation': {
'resource': 'crystals',
'embeddable': True,
},
},
'user_id': {
'type': 'objectid',
'required': True,
'data_relation': {
'resource': 'users',
'embeddable': True,
},
},
}
shares = {
'internal_resource': True,
'schema': shares_schema,
}
crystals_shares = {
'schema': shares_schema,
'url': 'crystals/<regex("[a-f0-9]{24}"):crystal_id>/shares',
'datasource': {'source': 'shares'},
}