2015-04-15 12 views
7

Ho una configurazione molto simile alla persona in questa domanda: How do I update a list data_relation in Python Eve con una risorsa utenti e una sub-risorsa di amici di tipo lista.Come aggiungere a un elenco digitare in Python Eve senza sostituire i vecchi valori

users = { 
    … 
    ‘friends’: { 
    'type': 'list’, 
     'schema': { 
     'type': 'objectid’, 
     'data_relation': { 
      'resource': 'users’ 
     } 
    } 
} 
}, 

Tuttavia, quando provo ad aggiungere un nuovo valore alla lista amici, gli altri valori nella lista vengono sostituiti dal nuovo valore. Come posso aggiungere un singolo valore alla lista e mantenere i vecchi valori?

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" 
] 
} 

Ho anche provato PUT, ma sostituisce anche l'elenco con il nuovo valore.

EDIT: ho appena provato ad utilizzare 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 
} 
} 

E

POST /users/5522987f893e3902048c55ff 
{"friends": ["552e9eb0893e391063045edc"]} 

RESPONSE: 
{ 
"_status": "ERR", 
"_error": { 
    "message": "The method is not allowed for the requested URL.", 
    "code": 405 
} 
} 
+0

È necessario utilizzare un POST per aggiungere un nuovo elemento ... –

+0

Non utilizzare mai MS Word per modificare programmi o dati. Hai alcune ellissi e virgolette che vengono automaticamente corrette. –

+0

Grazie per la rapida risposta! Ho appena modificato la mia domanda dopo aver provato a pubblicare un nuovo amico. –

risposta

1

POST vi permetterà di aggiungere un nuovo documento al users endpoint. Se restituisce un 405, è molto probabile che sia necessario abilitare il metodo POST aggiungendolo all'elenco RESOURCE_METHODS, poiché tutti gli endpoint sono di sola lettura per impostazione predefinita; vedi docs (in alternativa si può attivare solo POST per l'individuo endpoint aggiungendo il metodo alla locale resource_methods invece.)

PATCH consente la sostituzione dei singoli campi (al contrario di PUT, che sostituirà l'intero documento). Quindi con PATCH è possibile aggiornare atomicamente l'elenco friends per sostituendo con un nuovo valore (una nuova lista ObjectIds nel tuo caso), ma non è possibile inserire un nuovo ObjectId all'interno dell'elenco esistente, temo.

+0

Sono in grado di pubblicare su "utenti", non su un singolo "utenti/". Vedo che non è consentito, perché ottengo un ConfigException da Eve quando lo aggiungo all'elenco "ITEM_METHODS".Userò PATCH come dici tu e tieni traccia dei vecchi valori. Grazie per la tua risposta! –

+3

Esiste un piano per supportare l'operazione 'push-to-list-field' in Eve? – xiaohan2012

+0

@nicola, c'è un modo per aggiungere i documenti della lista. –

1

Ecco la soluzione che ho utilizzato. Probabilmente non è il modo più efficace per farlo, ma ha funzionato per me.

Invece di avere un elenco users/friends come avevo inizialmente previsto, ho finito per creare una risorsa per shares. Nel mio caso, ho voluto sapere quale crystals sono stati condivisi con il quale users. Così, quando interrogo crystals/<crystal_id>/shares, dovrei ottenere un elenco di la shares per quella crystal.

Penso che si potrebbe applicare una soluzione di questo tipo allo scenario users/friends se si scambia crystals per users e shares per friends. si potrebbe mettere due diversi user_id data_relations nel friends_schema (il mio 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'}, 
} 
Problemi correlati