如何在Python Eve中添加列表类型而不替换旧值

时间:2015-04-15 20:10:47

标签: python rest eve

我在此问题中对此人的设置非常相似: 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
}
}

2 个答案:

答案 0 :(得分:2)

以下是我使用的解决方法。它可能不是最有效的方法,但它对我有用。

我没有像我原先计划的那样拥有users/friends列表,而是最终为shares.创建了一个资源。在我的情况下,我想知道与哪个crystals共享{ {1}}因此,当我查询users.时,我应该获得crystals/<crystal_id>/shares,的{​​{1}}列表

我认为如果您为shares交换crystal.users/friends替换crystals,我认为您可以将这样的解决方案应用于users方案您shares(我的friends.)中的user_id个数据关系不同。

friends_schema

答案 1 :(得分:1)

POST将允许您将新文档添加到users端点。如果它返回405,则您很可能需要通过将POST方法添加到RESOURCE_METHODS列表来启用POST方法,因为默认情况下所有端点都是只读的;请参阅docs(或者,您只能通过将方法添加到本地resource_methods来为单个端点启用POST。)

PATCH允许替换单个字段(而不是PUT,它将替换整个文档)。因此,使用PATCH,您可以通过用新值替换来自动更新friends列表(在您的情况下为新的列表ObjectIds),但是您不能在现有列表中推送单个新的ObjectId , 我害怕。