2015-05-13 12 views
49

Ho provato qualcosa del genere, non funziona.Come ottenere Request.User in serializer Django-Rest-Framework?

class PostSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Post 

    def save(self): 
     user = self.context['request.user'] 
     title = self.validated_data['title'] 
     article = self.validated_data['article'] 

Ho bisogno di un modo per accedere a request.user dalla mia classe Serializer.

+0

DRF 'CurrentUserDefault' è assolutamente ❤️ http://www.django-rest-framework.org/api-guide/validators/# currentuserdefault – andi

risposta

91

Non è possibile accedere direttamente allo request.user. È necessario accedere all'oggetto richiesta e quindi recuperare l'attributo utente.

Ti piace questa:

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

O per essere più sicuro,

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

Altro su extra context can be read here

+1

dice 'NameError: name 'self' non è definito ' – Coderaemon

+0

ovviamente, questo era nel contesto di una classe. Molto probabilmente non si trova nel contesto di una classe – karthikr

+1

Nel mio serializzatore, nel metodo 'validate()', self.context è un dict vuoto. Perché? –

37

In realtà, non c'è bisogno di preoccuparsi di contesto. C'è un modo molto migliore per farlo:

from rest_framework.fields import CurrentUserDefault 

class PostSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Post 

    def save(self): 
     user = CurrentUserDefault() # <= magic! 
     title = self.validated_data['title'] 
     article = self.validated_data['article'] 
+0

Questo mi ha fatto risparmiare un sacco di mal di testa. Grazie per la pubblicazione! – Paul

+0

Sei il salvatore!) Grazie. – abcdn

22

Come Igor menzionato in un'altra risposta, l'uso può utilizzare CurrentUserDefault. Se non si desidera sovrascrivere metodo di salvataggio solo per questo, quindi utilizzare doc:

from rest_framework import serializers 
from rest_framework.fields import CurrentUserDefault 

class PostSerializer(serializers.ModelSerializer): 
    user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault()) 
    class Meta: 
     model = Post 
+5

'from rest_framework.fields import CurrentUserDefault' non è necessario – e4c5

Problemi correlati