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)
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? –
@Bob: Viewset-Code in Frage Details hinzugefügt, plz gucken. – Wendy
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, ...})'. –