2015-05-13 4 views
49

Próbowałem czegoś takiego, to nie działa.Jak uzyskać Request.User w serializatorze 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'] 

Potrzebuję sposobu na uzyskanie dostępu do request.user z mojej klasy Serializer.

+0

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

Odpowiedz

91

Nie można uzyskać dostępu bezpośrednio do request.user. Musisz uzyskać dostęp do obiektu żądania, a następnie pobrać atrybut użytkownika.

Jak to:

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

Albo być bardziej bezpieczne,

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

Więcej na extra context can be read here

+1

mówi: 'NameError: name 'self' nie jest zdefiniowane' – Coderaemon

+0

oczywiście, było to w kontekście klasy. Najprawdopodobniej nie jesteś w kontekście klasy – karthikr

+1

W moim serializatorze, w metodzie 'validate()' self.context jest pustym dict. Czemu? –

37

Faktycznie, nie trzeba męczyć się z kontekstu. Jest o wiele lepszy sposób na zrobienie tego:

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

To zaoszczędziło mi wielu bólów głowy. Dzięki za publikację! – Paul

+0

Jesteś zbawicielem!) Thanx. – abcdn

22

Jak wspomniał Igor w innej odpowiedzi, użycie może użyć CurrentUserDefault. Jeśli nie chcesz, aby zastąpić metodę oszczędzania tylko za to, a następnie użyj 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' nie jest potrzebny – e4c5