Pydantic 2.0+对象Redis缓存问题:含exclude字段的序列化修复需求
解决方案
修复现有代码的简单方法
问题根源是model_dump_json默认会遵循字段的exclude=True规则,哪怕你手动指定include所有模型字段,被标记为exclude的字段仍会被过滤。要强制保留这些字段,只需在序列化时将exclude参数设为空集合,覆盖字段级别的排除规则:
from pydantic import BaseModel, Field, computed_field class MyModel(BaseModel): name: str hidden_field: str = Field(exclude=True, default=None) @computed_field def visible_upper(self) -> str: try: return self.hidden_field.upper() except: return "" my_obj = MyModel(name="foo", hidden_field="bar") print("Before serialization:", my_obj.visible_upper) # 强制包含所有字段,忽略字段级exclude规则 my_dump = my_obj.model_dump_json(exclude=set()) my_obj = MyModel.model_validate_json(my_dump) print("After serialization:", my_obj.visible_upper)
执行后输出恢复正常:
Before serialization: BAR After serialization: BAR
如果要适配任意Pydantic模型,可封装通用序列化/反序列化函数:
def serialize_pydantic(obj): return obj.model_dump_json(exclude=set()) def deserialize_pydantic(json_str, model_cls): return model_cls.model_validate_json(json_str)
适用的现代工具包
若不想手动实现缓存逻辑,可使用pydantic-redis——它专为Pydantic 2.x设计,支持直接将模型缓存到Redis,自动处理序列化/反序列化,无需手动处理字段排除问题:
安装命令:
pip install pydantic-redis
简单使用示例:
from pydantic_redis import Model, Store, RedisConfig class MyModel(Model): _primary_key_field: str = "name" name: str hidden_field: str = Field(exclude=True, default=None) @computed_field def visible_upper(self) -> str: try: return self.hidden_field.upper() except: return "" # 配置Redis连接 redis_config = RedisConfig(db=0, host="localhost", port=6379) store = Store(name="my_store", redis_config=redis_config, life_span=3600) # 注册模型到缓存存储 store.register_model(MyModel) # 插入对象到缓存 my_obj = MyModel(name="foo", hidden_field="bar") MyModel.insert([my_obj]) # 从缓存读取对象 cached_obj = MyModel.get(ids=["foo"])[0] print(cached_obj.visible_upper) # 输出 BAR
内容的提问来源于stack exchange,提问作者Tolik K
相关产品推荐
相关产品推荐

