json 如何序列化/反序列化pydantic模型中的私有字段

3npbholx  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(231)

我使用pydantic来建模对象,然后将其序列化为json并持久化到mongodb中。为了更好地封装,我希望某些字段是私有的,但我仍然希望在保存到mongodb时将其序列化为json,然后在从db获取对象时从json反序列化回来
如何才能做到这一点?
示例型号:

class MyModel(BaseModel):
    public_field: str
    _creation_time: str

    def __init__(self, public_field: str):
        super().__init__(public_field=public_field,
                         _creation_time=str(datetime.now()))

model = MyModel(public_field='foo')
json_str = model.json()
print(json_str)

此代码的输出为:

{"public_field": "foo"}

我希望它是这样的:

{"public_field": "foo", "_creation_time": "2023-03-03 09:43:47.796720"}

然后还能够将上面的JSON反序列化回填充了私有字段的状态

bxjv4tth

bxjv4tth1#

Pydantic并不喜欢这些私有字段,默认情况下它会忽略值,并且对设置哪些字段非常严格。
一种解决方法是允许将字段添加为Extra(尽管这将允许添加多个字段)。
以下代码的工作方式与您预期的相同:

class MyModel(BaseModel, extra=Extra.allow):
    public_field: str
    _creation_time: str

    def __init__(self, **kwargs):
        kwargs.setdefault("_creation_time", str(datetime.now()))
        super().__init__(**kwargs)
model = MyModel(public_field='foo')
print(model)
json_str = model.json()
print(json_str)
print(MyModel.parse_obj({"public_field": "foo", "_creation_time": "2023-03-05 00:08:21.722193"}))
public_field='foo' _creation_time='2023-03-05 00:12:35.554712'
{"public_field": "foo", "_creation_time": "2023-03-05 00:12:35.554712"}
public_field='foo' _creation_time='2023-03-05 00:08:21.722193'

注意,因为字段本身被忽略了,所以设置Field(default_factory=...)将不起作用,因此您只能使用更笨拙的__init__方法,

相关问题