2014-12-24 43 views
8

Sto provando a utilizzare la classe CurrentUserDefault per un serializzatore.Django REST Framework - CurrentUserDefault use

user = serializers.HiddenField(default=serializers.CurrentUserDefault()) 

la documentazione dice:

Per poter utilizzare questo, la 'richiesta' deve essere stato fornito come parte del dizionario contesto quando si crea un'istanza della serializzatore.

Non sono sicuro di come creare il serializzatore. Nella visualizzazione creo tutti i serializzatori con:

serializer = NewModelSerializer(data=request.data) 

Così ho tentato:

context = dict(request.data) 
context['request'] = request 
serializer = NewModelSerializer(data=context) 

e

context['request'] = {'user': request.user} 

E in entrambi i casi l'errore è lo stesso:

Exception Type:  KeyError 
Exception Value: 'request' 
on: 
/Users/Alfonso/virtualenvs/sports/lib/python2.7/site-packages/rest_framework/fields.py in set_context 

     self.user = serializer_field.context['request'].user 

Inoltre ho provato a unicode il chiavi del dizionario (u'request') con la stessa fortuna.

C'è un modo migliore per passare l'utente registrato a un serializzatore?

sto usando Django REST Framework 3.0 e Python 2.7.6

risposta

11

Django REST quadro gestisce la serializzazione e deserializzazione di oggetti utilizzando un serializzatore centrale. Per aiutare a deserializzare e serializzare a volte, ha bisogno di un po 'di contesto come l'attuale view o request che viene utilizzato. Di solito non devi preoccuparti perché le viste generiche gestiscono automaticamente per te. Questo è coperto nella documentazione sotto "Including extra context" e sfrutta il parametro opzionale context per i serializzatori.

Quando si utilizzano i serializzatori manualmente, il contesto deve essere passato come dizionario. Alcuni campi richiedono chiavi specifiche, ma per la maggior parte è sufficiente che la chiave request sia un riferimento alla richiesta in entrata. Ciò consentirà allo HyperlinkedRelatedField di generare un URL completo e ad extra come lo CurrentUserDefault da eseguire come previsto.

context = { 
    "request": self.request, 
} 

serializer = NewModelSerializer(data=request.data, context=context) 

Il dizionario contesto è disponibile sulle viste generiche come il metodo get_serializer_context, che popolerà automaticamente il dizionario con chiavi di uso comune come il request e view anche.

+4

Lei ha salvato il mio Natale –

+1

Questo è molto utile. E sfortunatamente l'errore che genera se non si fornisce il contesto in più non è affatto d'aiuto. Genera un'eccezione KeyError con il messaggio "richiesta". – Emeka

Problemi correlati