小编ros*_*hii的帖子

如何从 pydantic 模型解析和读取“_id”字段?

我正在尝试将 MongoDB 数据解析为 pydantic 模式,但无法读取其_id字段,该字段似乎从模式中消失了。
该问题肯定与对象属性前面的下划线有关。我无法更改_id字段名称,因为这意味着根本不解析该字段。
请在下面找到我使用的代码(为了简化而使用int而不是)ObjectId

from pydantic import BaseModel

class User_1(BaseModel):
    _id: int

data_1 = {"_id": 1}

parsed_1 = User_1(**data_1)
print(parsed_1.schema())

class User_2(BaseModel):
    id: int

data_2 = {"id": 1}

parsed_2 = User_2(**data_2)
print(parsed_2.schema())
Run Code Online (Sandbox Code Playgroud)

User_1解析成功,因为它的_id字段是必需的,但之后无法读取。 User_2在上面的示例中,如果附加到 Mongo 则失败,但 Mongo 不提供任何id字段,但_id

上面代码的输出如下:

User_1  {'title': 'User_1', 'type': 'object', 'properties': {}}
User_2  {'title': 'User_2', 'type': 'object', 'properties': {'id': {'title': 'Id', 'type': 'integer'}}, 'required': ['id']}
Run Code Online (Sandbox Code Playgroud)

python mongodb pydantic

19
推荐指数
1
解决办法
2万
查看次数

如何在pydantic模型中解析ObjectId?

我正在尝试将 MongoDB 记录解析为 pydantic 模型,但未能这样做 ObjectId

据我了解,我需要为 ObjectId 设置验证器,并尝试扩展 ObjectId 类并validator使用 ObjectId将装饰器添加到我的类中。我做了如下。

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')}
Run Code Online (Sandbox Code Playgroud)

不幸的是,两个“解决方案”都失败了,如下所示:

>>> test = User(**data)
Traceback (most recent call last):
  File "<stdin>", …
Run Code Online (Sandbox Code Playgroud)

python parsing mongodb objectid pydantic

7
推荐指数
3
解决办法
4958
查看次数

标签 统计

mongodb ×2

pydantic ×2

python ×2

objectid ×1

parsing ×1