IT-Swarm.Net

Como obter o Request.User no serializador do Django-Rest-Framework?

Eu tentei algo assim, isso não funciona.

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

Eu preciso de uma maneira de poder acessar request.user da minha classe Serializer.

82
PythonIsGreat

Você não pode acessar o request.user diretamente. Você precisa acessar o objeto de solicitação e, em seguida, buscar o atributo do usuário.

Como isso:

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

Ou para ser mais seguro,

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

Mais sobre contexto extra pode ser lido aqui

165
karthikr

Hospedagem em nuvem rápida, confiável e acessível

Inscreva-se e receba $50 de bônus em 30 dias!

Na verdade, você não precisa se preocupar com o contexto. Existe uma maneira muito melhor de fazer isso:

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']
64
Igor Pomaranskiy

Como Igor mencionou em outra resposta, use use CurrentUserDefault. Se você não quiser sobrescrever o método save apenas para isso, então use doc :

from rest_framework import serializers

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