【问题标题】:How to add to a list type in Python Eve without replacing old values如何在 Python Eve 中添加到列表类型而不替换旧值
【发布时间】:2015-06-21 23:41:52
【问题描述】:

我的设置与这个问题中的人非常相似: 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 添加新元素...
  • 切勿使用 MS Word 编辑您的程序或数据。您有一些自动更正的省略号和引号。
  • 感谢您的快速回复!在尝试发布新朋友后,我刚刚编辑了我的问题。
  • @AmyEubanks 我有同样的问题。你是如何解决这个问题的,因为它在 eve 中不受本机支持。
  • @CraigH 我刚刚发布了我的解决方法。

标签: python rest eve


【解决方案1】:

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

我没有像最初计划的那样拥有users/friends 列表,而是最终为shares. 创建了一个资源在我的情况下,我想知道哪个crystals 与哪个users. 共享所以当我查询时crystals/<crystal_id>/shares, 我应该得到shares 的列表crystal.

如果您将crystals 换成usersshares 换成friends.,我认为您可以将这样的解决方案应用于users/friends 场景您可以在friends_schema 中放置两个不同的user_id data_relations (我的shares_schema)。

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'},
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我可以发布到“用户”,但不能发布到单个“用户/”。我看到这是不允许的,因为当我将它添加到“ITEM_METHODS”列表时,我从 Eve 那里得到了一个 ConfigException。我会像你说的那样使用 PATCH 并跟踪旧值。感谢您的回答!
    • 有计划支持 Eve 中的push-to-list-field 操作吗?
    • @nicola,有没有办法将文件追加到列表中。
    • 老实说,还没有想办法以适当的 RESTful 方式允许它。
    • 那么这是否意味着如果我想将 objectIds 添加到资源内部的列表中,唯一的方法是在列表不断增长时不断重新发送 PATCH?即,在我的客户端中,我必须缓存每个实例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 2018-06-21
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多