Django-tastypie può visualizzare un insieme diverso di campi nell'elenco e nelle viste dei dettagli di una singola risorsa?
Domanda
Vorrei che una particolare risorsa del modello django-tastypie
abbia solo un sottoinsieme di campi durante l'elencazione degli oggetti e tutti i campi quando si mostrano un dettaglio.È possibile?
Soluzione
Dovresti specificare tutti i campi nell'effettivo 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, Nota Si applicerà solo alle richieste di ricezione, dovresti essere ancora in grado di postare / inserire / patch sulla risorsa con tutti i campi se i limiti di autorizzazione ti permettono di farlo.
In un guscio di dado, si desidera caldare la hot patch L'elenco del campo interno prima di Full_Dehydrate viene chiamato su tutti gli oggetti ORM restituiti da obj_get_list
.
In alternativa, è possibile lasciare che il meccanismo di disidratazione completo avvenga e proprio alla fine di esso rimuovere i campi che non vuoi mostrare se non ti importa di spremere il più possibile la velocità possibile. Naturalmente dovresti farlo solo se l'URL è invocato 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
. Altri suggerimenti
Puoi anche usare il use_in
AttributoSu un campo per specificare la risorsa pertinente per mostrare il campo in. Questo può essere generatoDicetagcode o list
o una callback.
C'è un Open tey per questo su GitHub, con un numero diWorkarounds suggerito lì.
può anche utilizzare il metodo di disidratato (sé, bundle).
def dehydrate(self, bundle):
del bundle.data['attr-to-del]
return bundle