【问题标题】:How to access requested user object from jwt token in django serializers?如何从 django 序列化程序中的 jwt 令牌访问请求的用户对象?
【发布时间】:2022-01-30 16:57:18
【问题描述】:

用户注册后,用户想要将数据发布到客户端模型(OnetoOne与用户模型的关系)。因此,我想在 serializer-class 中访问请求的 user 对象,以在与请求的用户关联的 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

我已手动将用户 oject 添加到 serializer = CientSerializer(data=request.data)数据 中。 但是,它没有用。请告诉我如何从views.py 传递它或如何在serializers.py 中访问它。

【问题讨论】:

    标签: python django django-rest-framework jwt one-to-one


    【解决方案1】:

    当您在视图的 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)
    

    或者您可以阅读有关将上下文从视图传递到序列化程序的信息,在这种情况下,您可以传递所需的数据,例如 -

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

    然后你可以在你的序列化器中拥有你的请求对象,你可以获取 request.user 或者直接在上下文中传递它。

    【讨论】:

    • serializer = ClientSerializer(context={'user':request.user}, data=data)。在 serializer.py 中:user=self.context.get('user').
    【解决方案2】:

    尝试在视图中向用户传递性别和位置

    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)
    

    序列化器:

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

    【讨论】:

    • 请求不是不可变的?
    • 感谢您的方法。但是,它没有用。
    • 在 fields = 'all' 中,用户属性也来了。但我们不希望我们的客户自己输入“用户”。
    【解决方案3】:

    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)
    

    序列化器.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
    

    【讨论】:

      猜你喜欢
      • 2020-03-04
      • 2020-11-01
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      • 2019-04-27
      • 2016-02-19
      • 2021-02-27
      相关资源
      最近更新 更多