Django用Serializer反序列化JSON为模型对象且不写入DB的实现方法
Django DRF 缓存反序列化不触发DB写入方案
ModelSerializer的save()方法默认绑定了数据库持久化逻辑,不管走create还是update分支都会执行SQL写入,要直接从缓存的JSON数据还原模型实例且不碰数据库,可直接使用以下两种基于DRF原生能力的实现,不需要改造现有序列化器:
方案1:通过校验后的数据直接实例化模型(优先选用)
序列化器完成数据校验后生成的validated_data是完全匹配模型字段规则的合法数据,直接用它初始化模型对象即可,全程无数据库操作:
import json # 读取缓存中的JSON字符串 cache_json_data = json.loads(serialized_data) deserializer = UserSerializer(data=cache_json_data) # 执行字段合法性校验,校验失败直接抛异常 deserializer.is_valid(raise_exception=True) # 直接初始化User实例,不调用save()就不会触发数据库写入 user_obj = User(**deserializer.validated_data)
适用场景:序列化器字段和模型字段一一对应,没有在create()/update()方法里写额外的实例加工逻辑。
方案2:临时阻断save的入库逻辑(适配有自定义序列化逻辑的场景)
如果你的序列化器在create()方法中实现了密码哈希、关联字段预处理这类和入库无关的实例加工逻辑,不想重复实现这部分代码,可以临时替换序列化器的create方法,跳过入库步骤直接返回实例:
import json cache_json_data = json.loads(serialized_data) deserializer = UserSerializer(data=cache_json_data) # 重写create方法,仅构造实例不执行数据库保存 def mock_create(validated_data): # 如果原create方法有实例加工逻辑,可在这里复用 return User(**validated_data) deserializer.create = mock_create # 此时调用save不会执行任何数据库操作,返回加工完成的User实例 user_obj = deserializer.save()
这种方式会完整走完序列化器所有的校验、字段预处理流程,和正常调用save的区别仅在于不会执行数据库写入。
注意事项
- 缓存序列化User对象时,必须把模型主键字段(通常为
id)包含在序列化字段中,否则还原出的实例没有主键值,后续如果误调用save会触发新纪录插入 - 还原出的无持久化实例如果带有多对多字段,在实例实际入库前无法操作多对多关系,纯缓存读取场景可忽略该限制
- 不要直接用
serializer.data的返回值初始化模型,其中可能包含SerializerMethodField生成的非模型字段,直接传参会报字段不存在错误,必须使用经过校验的validated_data
内容的提问来源于stack exchange,提问作者DubsWin
相关产品推荐
相关产品推荐

