如何将Pydantic与PyMongo集成?解决字典转JSON校验问题
解决方案
问题根源
Pydantic的Json类型专门用于校验JSON格式的字符串、字节或字节数组,它会将这类输入解析为Python对象。但PyMongo从MongoDB读取数据时,已经自动把BSON解析成了Python字典,直接传入Json类型自然会因类型不匹配报错。
方法一:替换Json类型为字典/任意类型(推荐)
既然已经拿到了解析后的字典,完全不需要用Json类型,直接用dict或Any来定义字段即可,Pydantic会自动处理这类结构:
from pydantic import TypeAdapter, BaseModel from typing import Dict, Any # contents是MongoDB集合 content = list(contents.find(projection={'_id': 0})) class Content(BaseModel): # 如果content的结构有明确键值类型,可替换为具体的Dict[KeyType, ValueType] content: Dict[str, Any] # 若结构完全不确定,也可以直接用 content: Any print(TypeAdapter(list[Content]).validate_python(content))
方法二:自定义字段验证器自动转换字典为JSON字符串
如果一定要保留Json类型,可以通过字段验证器在校验前自动将字典转为JSON字符串,无需手动遍历:
from pydantic import TypeAdapter, BaseModel, Json, field_validator import json # contents是MongoDB集合 content = list(contents.find(projection={'_id': 0})) class Content(BaseModel): content: Json @field_validator('content', mode='before') def convert_dict_to_json(cls, value): if isinstance(value, dict): return json.dumps(value) return value print(TypeAdapter(list[Content]).validate_python(content))
注意:这种方式会把字典转成JSON字符串存储在模型实例中,后续若要使用字典结构还需解析,不如方法一直接高效。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

