Search code examples
pythondjangodjango-rest-frameworkjwtone-to-one

How to access requested user object from jwt token in django serializers?


After user-registration, user wants to post data into Client model ( OnetoOne relationship with User model ). So, I want to access the requested user object inside the serializer-class to create a new row in Client model associated with the requested user.

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

I have manually added user oject into the data in serializer = CientSerializer(data=request.data). But, It didn't work. Please, tell me how to pass it from views.py or how to access it in serializers.py.


Solution

  • Pass user when you do serializer.save in post method of views like

    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)
    

    Or you can read about passing context from views to serializers and in this context you can pass your required data like -

    serializer = ClientSerializer(context = {'request':request}, data=request.data)
    

    then you can have your request object in your serializers and you can get request.user or directly pass it in the context.