satyajit
satyajit

Reputation: 694

How to get request user id in Django Serializers?

I'm getting KeyError: 'request' while i want to get the current user id through user request. I tried something like this: validated_data['user_id'] = CarOwnerCarDetails.objects.get(user_id=self.context['request'].user.id) but it's throwing me KeyError.
How to get the current user id through request in serializers?
if any help would be much appreciated. Thank you so much in advance my friends.

models :

class CarOwnerCarDetails(models.Model):
    user_id = models.OneToOneField(User, on_delete=models.CASCADE)
    car_plate_number = models.CharField(max_length=20, null=True, blank=True)

class GetQuotes(models.Model):
    user = models.ForeignKey(CarOwnerCarDetails, on_delete=models.CASCADE, blank=True, null=True)
    subject = models.CharField(max_length=240, blank=False, null=True)

serializers :


class ShopGarageGetQuoteSerializer(ModelSerializer):
    subject = CharField(error_messages={'required':'subject key is required', 'blank':'subject is required'})
    user_id = serializers.CharField(read_only=True)
    
    class Meta:
        model = GetQuotes
        fields= ['user_id', 'subject']      
      
    def create(self,validated_data):
        subject        = validated_data['subject']
        validated_data['user_id'] = CarOwnerCarDetails.objects.get(user_id=self.context['request'].user.id)

        quotes_obj = GetQuotes.objects.create(
            subject=subject,
            user_id=validated_data['user_id']
            ) 
        return validated_data    

views.py :

class ShopGarageGetQuoteAPIView(APIView):
    permission_classes = (IsAuthenticated,)
    def post(self,request,*args,**kwargs):
        data           = request.data
        serializer =  ShopGarageGetQuoteSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response({'success' :'True','message' : 'Quotes send successfully','data' : serializer.data},status=200)
        return Response(serializer.errors,status=400)

Upvotes: 1

Views: 3759

Answers (1)

Massimo Costa
Massimo Costa

Reputation: 1860

as is written in the Official Documentation the user information (if the Authentication framework is correctly setup) is available using request.user

In your View you have to pass it using the serializer's context

class ShopGarageGetQuoteAPIView(APIView):
    permission_classes = (IsAuthenticated,)
    def post(self,request,*args,**kwargs):
        data  = request.data
        context = {'request': request} 
        serializer =  ShopGarageGetQuoteSerializer(data=request.data, context=context)
        if serializer.is_valid():
            serializer.save()
            return Response({'success' :'True','message' : 'Quotes send successfully','data' : serializer.data},status=200)
        return Response(serializer.errors,status=400)

For Generic Views/Viewsets the standard context contains 'request', 'view' and 'format' but in a standard APIView you have to pass it manually

Upvotes: 3

Related Questions