Как получить доступ к запрашиваемому объекту пользователя из jwt-токена в сериализаторах django?

После регистрации пользователя, пользователь хочет разместить данные в модели Client (OnetoOne отношения с моделью User). Поэтому я хочу получить доступ к запрошенному объекту user внутри serializer-class для создания новой строки в модели Client, связанной с запрошенным пользователем.

models.py

class Client(models.Model):
user= models.OneToOneField(User, on_delete=models.CASCADE, null=False, blank=False)
sex = models.CharField(max_length = 6, blank=False, null=False)
location = models.CharField(max_length = 30, null = False, blank = False)  

views.py

class ClientRegister(GenericAPIView):
def post(self, request):  
    user = request.user
    serializer = ClientSerializer(data= request.data)
    if serializer.is_valid():       
        serializer.save()           
        return Response(status= status.HTTP_201_CREATED)
    else:
        return Response(data= 'Invalid Form', status= status.HTTP_400_BAD_REQUEST)

serializers.py

class ClientSerializer(serializers.ModelSerializer):  
class Meta:
    model = Client
    fields = ['sex', 'location']  

def create(self, validated_data):
    sex = validated_data.get('sex')
    location = validated_data.get('location')         

    user =  #------ Want requested user object here ------#
    
    if user.is_client:    
        client = Client(user=user, sex=sex, location=location)
        client.save()
        return client

Я вручную добавил объект пользователя в data в serializer = CientSerializer(data=request.data). Но это не помогло. Пожалуйста, подскажите, как передать его из views.py или как получить к нему доступ в serializers.py.

Попытка передать пользователю пол и местоположение в представлениях

class ClientRegister(GenericAPIView):
    def post(self, request):  
        data = request.data
        user = request.user
         #add user in key
        data['user']=user
        serializer = ClientSerializer(data=data)
        if serializer.is_valid():       
            serializer.save()           
            return Response(status= status.HTTP_201_CREATED)
        else:
            return Response(data= 'Invalid Form', status= status.HTTP_400_BAD_REQUEST)

serializer:

class ClientSerializer(serializers.ModelSerializer):  
   class Meta:
      model = Client
      fields = '__all__'

Передать пользователя при выполнении serializer.save в post методе представления, как

def post(self, request):  
    u = request.user
    serializer = ClientSerializer(data= request.data)
    if serializer.is_valid():       
        serializer.save(user=u)           
        return Response(status= status.HTTP_201_CREATED)
    else:
        return Response(data= 'Invalid Form', status= status.HTTP_400_BAD_REQUEST)

Или вы можете прочитать о передаче контекста от представлений к сериализаторам, и в этом контексте вы можете передать необходимые данные.

views.py

class ClientRegister(GenericAPIView):
  def post(self, request):  
    user = request.user
    serializer = ClientSerializer(context={'user':user}, data= request.data)
    if serializer.is_valid():       
      serializer.save()           
      return Response(status= status.HTTP_201_CREATED)
    else:
      return Response(data= 'Invalid Form', status= status.HTTP_400_BAD_REQUEST)

serializers.py

 class ClientSerializer(serializers.ModelSerializer):  
   class Meta:
     model = Client
     fields = ['sex', 'location']  

   def create(self, validated_data):
     sex = validated_data.get('sex')
     location = validated_data.get('location')         

     user = self.context.get('user')

     if user.is_client:    
       client = Client(user=user, sex=sex, location=location)
       client.save()
       return client
Вернуться на верх