È un compito piuttosto normale in Django REST Framework fornire ulteriori args
/kwargs
a un serializzatore per impostare i valori dei campi impostati non tramite request.data
, ma tramite il valore nei parametri url o cookie. Per esempio, ho bisogno di impostare il campo user
del mio modello Comment uguale a request.user
su richiesta POST. Questi argomenti aggiuntivi sono chiamati contesto.Django REST Framework: come funziona il contesto serializzatore?
Molte domande (1, 2) su StackOverflow suggeriscono che sovrascrivo get_serializer_context()
metodo della mia ModelViewSet
. Ho fatto e non aiuta. Ho cercato di capire, cosa c'è che non va, e ho scoperto che non capisco dal codice sorgente, come dovrebbe funzionare questo sistema di contesto in generale. (manca anche la documentazione su questo argomento)
Qualcuno può spiegare, dove serializzatore aggiunge contesto ai dati di richiesta normale? Ho trovato due posti, dove salva i valori dal contesto.
- serializer.save(), metodo, che si mescola con kwargs dati convalidati, ma di solito è chiamato senza argomenti (per esempio mediante ModelMixins).
- fields.
__new__()
, che memorizza in cache args e kwargs, ma sembra che nessuno li abbia mai letti più tardi.
Questo ho capito, ma cosa succede dopo? Non riesco a vedere, dove Serializer utilizza questo contesto per riempire i campi con valori, presi da esso. –
In casi normali il contesto non verrà utilizzato da un serializzatore. Se vogliamo accedere all'oggetto 'request' in un serializzatore, useremo' self.context.get ('request') '. Inoltre, nel metodo 'to_representation' di qualsiasi campo del serializzatore, possiamo accedere al' context' usando la variabile 'self.context'. –
(da [docs] (http://www.django-rest-framework.org/api-guide/serializers/#including-extra-context)) Un caso comune per includere 'context' è se si sta utilizzando un serializzatore che include relazioni ipertestuali, che richiede che il serializzatore abbia accesso alla richiesta corrente in modo che possa generare correttamente URL completi. –