我正在尝试将MongoDB记录解析为pydantic模型,但无法解析ObjectId
。
据我所了解,我需要为ObjectId设置验证器,并尝试扩展ObjectId类并使用ObjectId添加validator
修饰符到我的类中,我按照以下方式执行。
from pydantic import BaseModel, validator
from bson.objectid import ObjectId
class ObjectId(ObjectId):
pass
@classmethod
def __get_validators__(cls):
yield cls.validate
@classmethod
def validate(cls, v):
if not isinstance(v, ObjectId):
raise TypeError('ObjectId required')
return str(v)
class User(BaseModel):
who: ObjectId
class User1(BaseModel):
who: ObjectId
@validator('who')
def validate(cls, v):
if not isinstance(v, ObjectId):
raise TypeError('ObjectId required')
return str(v)
data = {"who":ObjectId('123456781234567812345678')}
很遗憾,两种“解决方案”均存在以下问题:
Translated text:
Unfortunately, both "solutions" have the following problems:
>>> test = User(**data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pydantic/main.py", line 274, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for User
id
field required (type=value_error.missing)
>>> test = User1(**data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pydantic/main.py", line 274, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for User1
who
ObjectId required (type=type_error)
我肯定在这里缺少了某些东西。
Pydantic2
的新解决方案是什么? - Ali Rnfrom typing_extensions import Annotated from pydantic import BaseModel from pydantic.functional_validators import AfterValidator from bson import ObjectId as _ObjectId def check_object_id(value: str) -> str: if not _ObjectId.is_valid(value): raise ValueError('Invalid ObjectId') return value ObjectId = Annotated[str, AfterValidator(check_object_id)] class Example(BaseModel): id: ObjectId print(Example(id='5f9b3b3b9d9f3d0001a3b3b3')) print(Example(id='1'))
- Heichou