[英]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.