简体   繁体   English

如何从 django 序列化程序中的 jwt 令牌访问请求的用户 object?

[英]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 ).用户注册后,用户希望将数据发布到客户端 model (与用户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.因此,我想在序列化程序类中访问请求的用户 object以在与请求的用户关联的客户端 model 中创建一个新行。

models.py模型.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视图.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序列化程序.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) .我已手动将用户 oject 添加到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 .请告诉我如何从views.py传递它或如何在serializers.py中访问它。

Try to pass the user with sex and location in views尝试在视图中传递具有性别和位置的用户

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__'

Pass user when you do serializer.save in post method of views like当您在视图的 post 方法中执行 serializer.save 时传递用户,例如

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.然后你可以在你的序列化器中拥有你的请求 object 并且你可以得到 request.user 或者直接在上下文中传递它。

views.py视图.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序列化程序.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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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