Как добавить тип списка в Python Eve без замены старых значений

У меня очень похожая установка с человеком в этом вопросе: Как обновить список data_relation в 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, но он также заменяет список новым значением.

EDIT: я только что попробовал использовать 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
}
}

person Amy Eubanks    schedule 15.04.2015    source источник
comment
Вы должны использовать POST для добавления нового элемента...   -  person Gerard Rozsavolgyi    schedule 15.04.2015
comment
Никогда не используйте MS Word для редактирования ваших программ или данных. У вас есть многоточие и кавычки, которые автоматически исправляются.   -  person Greg M. Krsak    schedule 15.04.2015
comment
Спасибо за быстрый ответ! Я только что отредактировал свой вопрос после того, как попытался опубликовать нового друга.   -  person Amy Eubanks    schedule 15.04.2015
comment
@AmyEubanks У меня такая же проблема. Как вы решили эту проблему, поскольку она изначально не поддерживается в eve.   -  person CraigH    schedule 09.02.2016
comment
@CraigH Я только что опубликовал свой обходной путь.   -  person Amy Eubanks    schedule 12.02.2016


Ответы (2)


POST позволит вам добавить новый документ в конечную точку users. Если он возвращает 405, вам, скорее всего, нужно включить метод POST, добавив его в список RESOURCE_METHODS, поскольку по умолчанию все конечные точки доступны только для чтения; см. документы (в качестве альтернативы вы можете включить POST только для отдельной конечной точки, добавив метод в местный resource_methods вместо этого.)

PATCH позволяет заменять отдельные поля (в отличие от PUT, который заменяет весь документ). Таким образом, с помощью PATCH вы можете атомарно обновить список friends, заменив его новым значением (в вашем случае новым списком ObjectId), но вы не можете вставить один новый ObjectId в существующий список, я боюсь .

person Nicola Iarocci    schedule 16.04.2015
comment
Я могу отправить сообщение «пользователям», но не одному «пользователю/‹id›». Я вижу, что это не разрешено, потому что я получаю исключение ConfigException от Eve, когда добавляю его в список «ITEM_METHODS». Я буду использовать PATCH, как вы говорите, и отслеживать старые значения. Спасибо за Ваш ответ! - person Amy Eubanks; 16.04.2015
comment
Планируется ли поддержка операции push-to-list-field в Eve? - person xiaohan2012; 26.10.2015
comment
@nicola, есть ли способ добавить документы в список. - person James; 11.02.2016
comment
Честно говоря, еще не придумал, как разрешить это должным образом RESTful. - person Nicola Iarocci; 11.02.2016
comment
Означает ли это, что если я хочу добавить идентификаторы объектов в список внутри ресурса, единственным способом является повторная отправка PATCH по мере роста списка? То есть в моем клиенте я должен кэшировать каждый экземпляр? - person Dominooch; 18.01.2017

Вот обходной путь, который я использовал. Это, вероятно, не самый эффективный способ сделать это, но это сработало для меня.

Вместо списка users/friends, как я изначально планировал, я создал ресурс для shares.. В моем случае я хотел знать, какие crystals совместно используются с какими users.. Поэтому, когда я запрашиваю crystals/<crystal_id>/shares,, я должен получить список shares для этого crystal.

Я думаю, что вы могли бы применить подобное решение к сценарию users/friends, если вы поменяли местами crystals на users и shares на friends..

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'},
}
person Amy Eubanks    schedule 12.02.2016