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)
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? –
@Bob: aggiunto codice viewet nei dettagli della domanda, date un'occhiata. – Wendy
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, ...})'. –