v1:

对于 pydantic V1.2 之后来讲:

class Model(BaseModel):
    a: int = None
    b: Optional[int]
    c: Optional[int] = None
    d: Optional[int] = Field(None)

    e: int
    f: int = ...
    g: Optional[int] = ...
    h: Optional[int] = Field(...)

此实例中,

a, b, c, d是可选字段,也就是说在引用模型类时,可以省略不进行传递的参数。

e, f, g, h是必填字段,也就是说在引用模型类时,不可以省略的参数,必须将他们作为参数传递,并且只接受int类型。

V2:

对于目前(2022.9.8)尚未发布的 pydantic V2 之后来讲:

class Model(BaseModel):
    a: int = None
    b: Optional[int] = None
    c: Optional[int] = Field(None)

    d: int
    e: int = ...
    f: Optional[int]
    g: Optional[int] = ...
    h: Optional[int] = Field(...)

请注意他发生了很大的实质性变化,此实例中,

a, b, c是可选字段,也就是说在引用模型类时,可以省略不进行传递的参数。

d, e, f, g, h是必填字段,也就是说在引用模型类时,不可以省略的参数,必须将他们作为参数传递,与 V1 不同的是,Optional[int]变为了必填字段,但是除了int类型,它还可以接收None作为值进行传递,对于其他参数,只接受int类型。

总结

    不管使用 V1 还是 V2,当将模型类一个参数作为选填时,推荐使用Optional[xxx] = NoneUnion[xxx, None] = None,效果是一样的,看个人喜好,请不要直接使用Optional[xxx]作为选填 字段,因为 V1 和 V2 将不兼容!

基于Optional[]Union[]该如何选择,请移步 using-union-or-optional