Python 如何在DRF中使用JWT设置用户id字段

Python 如何在DRF中使用JWT设置用户id字段,python,django,django-rest-framework,Python,Django,Django Rest Framework,我想使用JWT令牌设置用户id字段,并在创建新预订时将其存储在数据库表中。可以有单个或多个预订请求。 每当用户创建预订时,我都希望在表中存储用户id。目前没有与之关联的外键。它只是一个整数字段 我可以从JWT获取用户id,但它不会在数据库中更新 我知道以前有人问过这个问题,我试过上一篇文章的所有答案,但它对我不起作用。我不知道为什么 model.py class reservations(models.Model): pet_id=models.IntegerField() user_i

我想使用JWT令牌设置用户id字段,并在创建新预订时将其存储在数据库表中。可以有单个或多个预订请求。 每当用户创建预订时,我都希望在表中存储用户id。目前没有与之关联的外键。它只是一个整数字段

我可以从JWT获取用户id,但它不会在数据库中更新

我知道以前有人问过这个问题,我试过上一篇文章的所有答案,但它对我不起作用。我不知道为什么

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)
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)
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
view.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)
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)
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
序列化程序.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)
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)
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

目前,它只是将用户id存储为0,这是模型中的默认设置。

SerializerMethodField默认为只读,下面快速查看源代码:

def __init__(self, method_name=None, **kwargs):
    self.method_name = method_name
    kwargs['source'] = '*'
    kwargs['read_only'] = True
    super(SerializerMethodField, self).__init__(**kwargs)
假设您想读写此字段;从序列化程序声明中删除
SerializerMethodField
重写;并在视图中设置
用户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)
当然;如果您不希望视图执行此操作(我在这里同意您的意见),请在上下文中传递它(显式),或使用
self.request.user.id
并覆盖
validate\u 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

谢谢你的答复。。此行出现无效语法错误[x['user_id']=request.user.id for x in data]My bad;更新。忘了我不能做清单理解中的作业:非常感谢你的帮助。。我一整天都在为这件事感到发热..哈哈,我很乐意帮忙:)