Я получаю KeyError: 'request', в то время как я хочу получить текущего пользователя id по запросу пользователя. Я пробовал что-то вроде этого: validated_data['user_id'] = CarOwnerCarDetails.objects.get(user_id=self.context['request'].user.id) но меня выкидывает KeyError.
Как получить текущего пользователя id через запрос в сериализаторах?
будет очень признателен за любую помощь. Заранее большое спасибо, друзья мои.

Модели:

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)

Сериализаторы:


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)

0
satyajit 18 Ноя 2020 в 11:25

1 ответ

Лучший ответ

Как написано в официальной документации, информацию о пользователе (если Платформа аутентификации настроена правильно) доступна с помощью request.user

В вашем представлении вы должны передать его с помощью сериализатора контекст

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)

Для Generic Views / Viewset стандартный контекст содержит 'request', 'view' и 'format', но в стандартном APIView вы должны передать его вручную.

2
Massimo Costa 18 Ноя 2020 в 08:33