2016-07-09 50 views
5
class MyModelSerializer(serializers.ModelSerializer): 
    field1 = serializers.CharField() 
    field2 = serializers.SerializerMethodField('get_awesome_user') 

    def get_current_user(self): 
     request = self.context.get("request") 
     if request and hasattr(request, "user"): 
      return request.user 
     return None 

    def get_awesome_user(self, obj): 
     user = self.get_current_user() 
     ## use this user object, do some stuff and return the value 
     return ... 

mio api (che utilizza authentication_classes e permission_classes) sta usando questa serializzatore e la funzione get_current_user restituisce sempre None. quando eseguo il debug, ho trovato che self.context è un dizionario vuoto, cioè {}. per essere doppiamente ho anche stampato self.context.keys(), ancora è una lista vuota.Django resto quadro - self.context non ha richiesta attributo

Ho seguito questa discussione.

Get current user in Model Serializer

PS: sto usando djangorestframework==3.3.3, Django==1.9.1

EDIT: l'aggiunta di codice viewset

class MyModelViewSet(viewsets.ModelViewSet): 

    authentication_classes = (SessionAuthentication, BasicAuthentication, TokenAuthentication) 
    permission_classes = (IsAuthenticated,) 

    def list(self, *args, **kwargs): 
     queryset = MyModel.objects.all() 
     page = self.paginate_queryset(queryset) 
     if page is not None: 
      serializer = MyModelSerializer(page, many=True) 
      return self.get_paginated_response(serializer.data) 

     serializer = MyModelSerializer(queryset, many=True) 
     return Response(serializer.data) 
+0

di solito, self.context è riempito da 'generics.py:GenericApiVie Funzione w.get_serializer_context() ', chiamata da' generics.py:GenericApiView.get_serializer() ', che a sua volta viene chiamata all'inizio di' viewset.list()/detail()/create()/delete())/update() 'in' mixins.py'. Puoi fornire il tuo codice ViewSet, perché è necessario capire cosa stai cercando di fare? –

+0

@Bob: aggiunto codice viewet nei dettagli della domanda, date un'occhiata. – Wendy

+0

Ci scusiamo per il ritardo. Wendy, '#some stuff 'non spiega molto. Come crei il serializzatore nel metodo 'list()' del tuo viewet? Dovresti chiamare 'serializer = self.get_serializer (data = request.data)' per ottenere il tuo contesto serializzatore pieno automaticamente, ma ho la sensazione che lo stai semplicemente creando manualmente, come, 'serializer = MyModelSerializer (instance)'. Dovresti chiamare 'get_serializer()', o passare l'argomento di contesto extra al costruttore del serializzatore: 'serializer = MyModelSerializer (instance, context = {'request': request, ...})'. –

risposta

11

Come si crea serializzatore nel metodo di vostra viewset list()? Si dovrebbe chiamare

serializer = self.get_serializer(data=request.data) 

per ottenere il vostro contesto serializzatore compilato automaticamente come si è fatto in default implementation of this method in DRF mixins, ma ho la sensazione che si sta solo creando manualmente, in questo modo:.

serializer = MyModelSerializer(instance) 
Così

, per risolvere questo problema, si dovrebbe neanche chiamare get_serializer(), o passare argomento extra contesto serializzatore costruttore:

serializer = MyModelSerializer(instance, context={'request': request, ...}) 
+0

Grazie! il tuo suggerimento ha funzionato :) – Wendy

+0

@Wendy Great! In bocca al lupo. –

Problemi correlati