Python Pydantic:如何实现可选但非空的字段?
解决Pydantic字段可选但禁止为Null的问题
要实现「字段可选(不传不报错),但传入时必须为字符串、不能是Null」的需求,可通过Pydantic的Field工具配置字段属性,具体方案如下:
Pydantic v2 版本
使用Field(required=False)标记字段为可选,同时保持类型为str,这样:
- 不传
name时,模型实例不会包含该字段,也不会触发验证错误 - 传入
name时必须是字符串类型,传None会直接触发ValidationError
示例代码:
from pydantic import BaseModel, Field class MyModel(BaseModel): id: int name: str = Field(required=False) # 正常执行,实例仅包含id字段 instance = MyModel(id=1) print(instance.model_dump()) # 输出: {'id': 1} # 传入合法字符串,正常创建实例 MyModel(id=1, name="Alice") # 传入None,触发验证错误 MyModel(id=1, name=None) # ValidationError: 1 validation error for MyModel # name # Input should be a valid string [type=string_type, input_value=None, input_type=NoneType]
Pydantic v1 版本
v1中语法略有不同,同样使用Field设置required=False:
from pydantic import BaseModel, Field class MyModel(BaseModel): id: int name: str = Field(..., required=False) # 不传name正常创建实例 instance = MyModel(id=1) print(instance.dict()) # 输出: {'id': 1} # 传None触发验证错误 MyModel(id=1, name=None) # ValidationError: 1 validation error for MyModel # name # none is not an allowed value (type=type_error.none.not_allowed)
这个方案完全符合需求:既允许不传入name字段,又严格禁止传入None值,同时不会在未传字段时将其设为None。
内容的提问来源于stack exchange,提问作者Some Guy
相关产品推荐
相关产品推荐

