简体   繁体   中英

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)

as is written in theOfficial 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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM