You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:06:02