2012-05-21 8 views

risposta

14

È necessario specificare tutti i campi nell'attuale ModelResource, quindi sovrascrivere il metodo get_list per filtrare solo i campi che si desidera visualizzare. Vedere l'implementazione interna di get_list su Resource per vedere come sovrascriverlo.

Tuttavia, si noti che questo si applica solo alle richieste GET, si dovrebbe comunque essere in grado di POST/PUT/PATCH sulla risorsa con tutti i campi se i limiti di autorizzazione consentono di farlo.

In un guscio di dado, si desidera eseguire il hot patch dell'elenco dei campi interni prima che venga chiamato full_dehydrate su tutti gli oggetti ORM restituiti da obj_get_list.

In alternativa, è possibile lasciare che il meccanismo di disidratazione completo avvenga e appena alla fine di esso rimuovere i campi che non si desidera mostrare se non si cura di spremere il più rapidamente possibile. Naturalmente è necessario farlo solo se l'URL viene richiamato come conseguenza della chiamata get_list. C'è un metodo di convenienza per questo alter_list_data_to_serialize(request, to_be_serialized).

Basta fare:

class SomeResource(Resource): 
    class Meta(...): 
     ... 
     field_list_to_remove = [ 'field1', 'field2' ] 
     ... 

    def alter_list_data_to_serialize(request, to_be_serialized): 
     for obj in to_be_serialized['objects']: 
      for field_name in self._meta.field_list_to_remove: 
       del obj.data[field_name] 
     return to_be_serialized 
+0

Questa è una buona idea, e apprezzo la tua risposta. Mi chiedo, tuttavia, se c'è un modo per rinviare i campi dalla query originale per evitare di inviare alcuni campi piuttosto grandi sul filo. – Carson

+1

Quindi suggerisco di creare semplicemente 2 risorse, una che mostri tutti i campi e un'altra che mostri solo il tuo sottoinsieme sullo stesso modello. È il modo più semplice senza troppi sovraccarichi. Se insisti che si tratti della stessa risorsa, puoi seguire la mia raccomandazione iniziale sull'overloading di get_list per includere solo il tuo sottoinsieme di campi quando li recuperi da ORM e li serializzi. – astevanovic

+3

Ci dovrebbe essere 'del obj.data [field_name]'. – Mitar

18

È inoltre possibile utilizzare l'attributo use_in su un campo per specificare la risorsa pertinente in cui visualizzare il campo. Può essere list o detail o un callback.

+2

Questa dovrebbe essere la risposta principale. Molto più ovvio e chiaro rispetto ai metodi prevalenti. – Radagast

+0

Questo è uno di quei casi in cui dovresti essere in grado di cambiare la risposta "Approvata" per quelli di noi che verranno in seguito alla festa. –

0

Può anche utilizzare il metodo di disidratazione (auto, fascio).

def dehydrate(self, bundle): del bundle.data['attr-to-del] return bundle

Problemi correlati