pydantic v1 已经不更新了

图片.png

https://pypi.org/project/pydantic/#history

但是我们还要继续使用 pydantic 等等模型, 但是 v1 和 v2 的 api 发生了巨大的变化

比如:

  • parser_raw 没有了, 可以用 model_validate_json 替代
  • parse_datetime 没有了
  • pydantic_encoder 没有了,改成 pydantic_core.to_jsonable_python 了
参考: How to continue to use pydantic_encoder and parse_datetime in a correct V2 version

还有下面的注意事项:

大多数原来功能都可以通过 from pydantic.v1.xxx 的方式继续使用

parse_datetime 替代方法

原来的 datetime_parse 子模块没有了

from pydantic.v1.datetime_parse import parse_datetime

需要改成下面这样

from pydantic.v1.datetime_parse import parse_datetime

注意事项一: 不能使用缺省的 None 了

在 v1 里面,model 的 field 如果标注了类型可以是 None,那么当创建这个对象的时候,缺省了这个 field,那么这个 field 会被设置为 None

比如,下面的代码可以正常工作

from pydantic import BaseModel


class RabbitMQConfig(BaseModel):
    host: str
    port: int
    username: str
    password: str
    vhost: str
    public_host: str | None


rabbitmq_config = RabbitMQConfig(
    **{'host': '192.168.38.223', 'port': 5672, 'username': 'pon', 'password': 'pon', 'vhost': '/'})

print(rabbitmq_config)
print(rabbitmq_config.password)
print(rabbitmq_config.public_host)

我希望实现的功能是,如果不传递 public_host,就默认设置为 None

输出如下:

host='192.168.38.223' port=5672 username='pon' password='pon' vhost='/' public_host=None
pon
None

但是到了 v2 里面就不行了,这个时候,你必须添加 = Field(None) 才行

我们现看看在 v2 下面,如果不添加 = Field(None) 会怎么样

from pydantic import BaseModel, Field


class RabbitMQConfig(BaseModel):
    host: str
    port: int
    username: str
    password: str
    vhost: str
    public_host: str | None


rabbitmq_config = RabbitMQConfig.model_validate(
    {'host': '192.168.38.223', 'port': 5672, 'username': 'pon', 'password': 'pon', 'vhost': '/'}, strict=False)

print(rabbitmq_config)
print(rabbitmq_config.password)
print(rabbitmq_config.public_host)

输出结果如下:

Traceback (most recent call last):
  File "/Users/ponponon/Desktop/code/me/ideaboom/003.py", line 33, in <module>
    rabbitmq_config = RabbitMQConfig.model_validate(
  File "/Users/ponponon/.local/share/virtualenvs/ideaboom-B0dr_aXc/lib/python3.10/site-packages/pydantic/main.py", line 503, in model_validate
    return cls.__pydantic_validator__.validate_python(
pydantic_core._pydantic_core.ValidationError: 1 validation error for RabbitMQConfig
public_host
  Field required [type=missing, input_value={'host': '192.168.38.223'...d': 'pon', 'vhost': '/'}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.4/v/missing

看到了吧,如果你不传递 public_host 就不会错

如果添加了 = Field(None) ,就可以把缺省的字段且声明可以为 None 的赋值为 None

from pydantic import BaseModel, Field


class RabbitMQConfig(BaseModel):
    host: str
    port: int
    username: str
    password: str
    vhost: str
    public_host: str | None = Field(None)


rabbitmq_config = RabbitMQConfig.model_validate(
    {'host': '192.168.38.223', 'port': 5672, 'username': 'pon', 'password': 'pon', 'vhost': '/'}, strict=False)

print(rabbitmq_config)
print(rabbitmq_config.password)
print(rabbitmq_config.public_host)

运行结果如下:

host='192.168.38.223' port=5672 username='pon' password='pon' vhost='/' public_host=None
pon
None

universe_king
3.4k 声望680 粉丝

引用和评论

0 条评论