How to get Request.User in Django-Rest-Framework serializer?

I tried something like this, it does not work.

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

I need a way to access request.user from my Serializer class.

+83
django django-rest-framework
May 13 '15 at 12:28
source share
4 answers

You cannot directly access request.user . You need to access the request object and then get the user attribute.

Like this:

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

Or, to be safer,

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

Read more about the additional context here.

+166
May 13 '15 at 1:06
source share
— -

Actually, you do not need to worry about the context. This is a much better way to do this:

 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
Jan 24 '16 at 11:41
source share

As Igor mentioned in another answer, use can use CurrentUserDefault. If you don't want to override the save method just for this, use doc :

 from rest_framework import serializers class PostSerializer(serializers.ModelSerializer): user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault()) class Meta: model = Post 
+28
May 04 '16 at 9:00 a.m.
source share

You need a little editing in your 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'] 

Here is an example using view blending models. In the create method, you can find the correct way to call the serializer. The get_serializer method correctly populates the context dictionary. If you need to use a different serializer defined in the set of views, see the update Method on how to start the serializer using the context dictionary, which also passes the request object to the serializer.

 class SignupViewSet(mixins.UpdateModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet): http_method_names = ["put", "post"] serializer_class = PostSerializer def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) def update(self, request, *args, **kwargs): partial = kwargs.pop('partial', False) instance = self.get_object() kwargs['context'] = self.get_serializer_context() serializer = PostSerializer(instance, data=request.data, partial=partial, **kwargs) serializer.is_valid(raise_exception=True) self.perform_update(serializer) return Response(serializer.data) 
0
Jul 19 '19 at 11:02
source share



All Articles