pydantic v1 已经不更新了
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。