2015-05-13 6 views
49

Ich habe so etwas versucht, es funktioniert nicht.Wie bekomme ich Request.User im Django-Rest-Framework Serializer?

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'] 

Ich brauche eine Möglichkeit, auf request.user von meiner Serializer-Klasse zugreifen zu können.

+0

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

Antwort

91

Sie können nicht direkt auf request.user zugreifen. Sie müssen auf das Anforderungsobjekt zugreifen und dann das Benutzerattribut abrufen.

So:

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

Oder sicherer,

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

Mehr auf extra context can be read here

+1

es heißt 'NameError: Name 'self' ist nicht definiert ' – Coderaemon

+0

natürlich war dies im Zusammenhang mit einer Klasse. Sie sind höchstwahrscheinlich nicht im Kontext einer Klasse – karthikr

+1

In meinem Serializer, in 'validate()' Methode, self.context ist ein leeres Diktat. Warum? –

37

Eigentlich zu sein, Sie müssen nicht mit Kontext stören. Es gibt einen viel besseren Weg es zu tun:

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

Das hat mir eine Menge Kopfschmerzen erspart. Danke fürs Schreiben! – Paul

+0

Sie sind der Retter!) Danke. – abcdn

22

Wie Igor in anderen Antwort erwähnt, kann CurrentUserDefault verwenden. Wenn Sie dies nicht nur speichern Methode außer Kraft setzen wollen, dann verwenden Sie 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

'aus rest_framework.fields Import CurrentUserDefault' ist nicht erforderlich – e4c5

Verwandte Themen