Django DRF如何合并JWT解析的用户数据与请求数据保存请假记录
解决方案
你不能直接对两个DRF序列化器实例执行加法运算来合并数据,该操作没有被框架支持。你要实现的「将用户数据填充到待保存的请假业务数据中」需求,无需序列化用户对象,直接读取用户实例的属性传入请假序列化器的保存逻辑即可。
1. 可选优化:调整序列化器配置(提升安全性)
把用户相关的字段设置为只读,避免前端传入的参数覆盖你从JWT解析得到的官方用户数据:
# serializer.py class leaveSerializers(serializers.ModelSerializer): class Meta: model = leave fields = ['id','hostel','room_no','where_to','reason','time_period','phone_number','name','father_name','branch','coer_id'] # 新增以下配置,用户字段设为只读 read_only_fields = ['name','father_name','branch','coer_id']
2. 修改视图层逻辑
去掉无效的序列化器相加操作,直接将用户属性传入save方法即可:
# views.py class leaveview(APIView): def post(self,request): token = request.data.get('jwt') if not token: raise AuthenticationFailed('Unauthenticated') try: payload = jwt.decode(token,'secret',algorithms=['HS256']) except jwt.ExpiredSignatureError: raise AuthenticationFailed('Unauthenticated') user=User.objects.filter(id=payload['id']).first() if not user: raise AuthenticationFailed('User not found') serializer2 = leaveSerializers(data=request.data) serializer2.is_valid(raise_exception=True) # 保存时传入用户字段,会自动合并到待保存的数据中 serializer2.save( name=user.name, father_name=user.father_name, branch=user.branch, coer_id=user.coer_id ) return Response(serializer2.data)
注意事项
- 以上代码默认你的
User模型的字段名和leave模型需要填充的字段名完全一致,如果User模型对应字段名不同,调整save参数里的取值即可,比如用户姓名字段是username就改成name=user.username。 - 如果你后续需要返回完整的用户+请假数据,再调用
UserSerializers(user)把用户数据和序列化后的请假数据合并到同一个字典返回即可。
内容的提问来源于stack exchange,提问作者justjokingbro
相关产品推荐
相关产品推荐

