You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 04:27:03