2016-07-09 4 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 ... 

Mein api (die authentication_classes und permission_classes verwendet) wird mit diesem Serializer und die get_current_user Funktion gibt immer None. wenn ich es debugge, fand ich, dass self.context leeres Wörterbuch ist, d. h. {}. um sicher zu sein, druckte ich auch self.context.keys(), noch ist es leere Liste.Django Rest Rahmen - self.context nicht Anfrage Attribut

Ich folgte diesem Thread.

Get current user in Model Serializer

PS: Ich bin djangorestframework==3.3.3 verwenden, Django==1.9.1

EDIT: Hinzufügen Viewset Code

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

Normalerweise self.context von 'generics.py:GenericApiVie gefüllt w.get_serializer_context() 'Funktion, die von' generics.py:GenericApiView.get_serializer() 'aufgerufen wird, die wiederum am Anfang von' viewset.list()/detail()/create()/delete ()/update() 'in' mixins.py'. Können Sie Ihren ViewSet-Code bereitstellen, weil er verstehen muss, was Sie tun möchten? –

+0

@Bob: Viewset-Code in Frage Details hinzugefügt, plz gucken. – Wendy

+0

Entschuldigung für Verspätung. Wendy, '# some stuff' erklärt nicht viel. Wie erstellt man Serializer in der 'list()' Methode des Viewsets? Sie sollten 'serializer = self.get_serializer (data = request.data)' aufrufen, um Ihren Serializer-Kontext automatisch zu füllen, aber ich habe das Gefühl, dass Sie ihn nur manuell erstellen, wie zum Beispiel 'serializer = MyModelSerializer (instance)'. Sie sollten 'get_serializer()' aufrufen oder ein zusätzliches Kontextargument an den Serializer-Konstruktor übergeben: 'serializer = MyModelSerializer (instance, context = {'request': request, ...})'. –

Antwort

11

Wie erstellen Sie Serializer in list() Methode Ihres Viewset? Sie sollten

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

rufen Sie Ihren Serializer Kontext automatisch gefüllt zu bekommen, wie es in default implementation of this method in DRF mixins geschehen ist, aber ich habe das Gefühl, dass Sie es einfach manuell zu erstellen, wie folgt aus:.

serializer = MyModelSerializer(instance) 

So , dies zu beheben, sollten Sie entweder rufen get_serializer() oder zusätzlichen Kontext Argument Konstruktor Serializer übergeben:

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

Danke! Ihr Vorschlag hat funktioniert :) – Wendy

+0

@Wendy Großartig! Viel Glück. –