简体   繁体   English

如何在DRF中使用JWT设置user_id字段

[英]How to set user_id field using JWT in DRF

I want to set user_id field using JWT token and store in database table when new reservation is created. 我想使用JWT令牌设置user_id字段,并在创建新预订时存储在数据库表中。 there can be single or multiple reservation request. 可以有一个或多个预订请求。 whenever user create reservation i want to store there user_id in our table. 每当用户创建预订时,我都希望将user_id存储在我们的表中。 currently there is no foreign key associated with it. 当前没有与之关联的外键。 it is simply an integer field. 它只是一个整数字段。

I am able to fetch user_id from JWT.but its not updating in database 我可以从JWT中获取user_id,但不会在数据库中更新

I know this question had been asked previously i tried all the answer of previous post but its not working for me. 我知道这个问题以前曾被问过,我尝试过上一篇文章的所有答案,但对我不起作用。 i dont know why 我不知道为什么

model.py 模型

class reservations(models.Model):
  pet_id=models.IntegerField()
  user_id=models.IntegerField(default=0)
  location=models.PositiveSmallIntegerField()
  arrival=models.DateTimeField()
  depature=models.DateTimeField()
  comments=models.TextField(max_length=200)

view.py view.py

class requestReservation(CreateAPIView):
  serializer_class = requestReservationSerailizer
  permission_classes = [IsAuthenticated]

  def create(self, request, *args, **kwargs):   
    serializer = requestReservationSerailizer(data=request.data,context={'user_id': request.user.id}, many=True)

    if not serializer.is_valid(raise_exception=False):
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


    self.perform_create(serializer)
    headers = self.get_success_headers(serializer.data)
    return Response({"message":"Success","status_message":"Reservation Created Successfully"},status=status.HTTP_200_OK)

serializer.py 序列化器

class requestReservationSerailizer(ModelSerializer):
  user_id = SerializerMethodField('set_user_id')
  class Meta:
    model=reservations
    fields = [
        'pet_id',
        'user_id',
        'location',
        'arrival',
        'depature',                 
        'comments',
    ]

  def set_user_id(self, obj):
    obj.user_id = self.context.get("user_id")
    return obj.user_id

currently it is simply storing user_id as 0 which is default set in model. 当前,它只是将user_id存储为0,这是模型中的默认设置。

SerializerMethodField is read-only by default, here's a quick look at the source code: 默认情况下, SerializerMethodField是只读的,下面是对源代码的快速浏览:

def __init__(self, method_name=None, **kwargs):
    self.method_name = method_name
    kwargs['source'] = '*'
    kwargs['read_only'] = True
    super(SerializerMethodField, self).__init__(**kwargs)

Assuming you want to read and write into this field; 假设您想在该字段中读写; remove the SerializerMethodField overriding from the serializer declaration; 从序列化程序声明中删除覆盖SerializerMethodField and set the user_id in your view 并在您的视图中设置user_id

class requestReservationSerailizer(ModelSerializer):
  class Meta:
    model=reservations
    fields = [
        'pet_id',
        'user_id',
        'location',
        'arrival',
        'depature',                 
        'comments',
    ]


  def create(self, request, *args, **kwargs):
    data = request.data.copy()
    for datum in data:
         datum['user_id'] = request.user.id

    serializer = requestReservationSerailizer(data=data, many=True)

    if not serializer.is_valid(raise_exception=False):
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


    self.perform_create(serializer)
    headers = self.get_success_headers(serializer.data)
    return Response({"message":"Success","status_message":"Reservation Created Successfully"},status=status.HTTP_200_OK)

Ofcourse; 当然; if you don't want your view to be doing this (and I'd agree with you here), then pass it in context (explicit) or use self.request.user.id and override validate_user_id 如果您不希望视图执行此操作(我在这里同意),则在上下文中(明确地)传递它,或使用self.request.user.id并覆盖validate_user_id

class requestReservationSerailizer(ModelSerializer):
  class Meta:
    model=reservations
    fields = [
        'pet_id',
        'user_id',
        'location',
        'arrival',
        'depature',                 
        'comments',
    ]

def validate_user_id(self, value):
    user_id = self.context.get('user_id', None)  # Assuming you continue to pass it in context
    if user_id is None:
        # Handle error
    return user_id
    # You can also do this; might raise an AttributeError if the user is not authenticated:
    # return self.request.user.id

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

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