Fastapi Pydantic 可选字段

4

目前我正在学习Python和Fastapi,但是我不知道typing.Optional有什么用。

class Post(BaseModel):
    # default value
    rating: int = None
    # typing.Optional
    rating: Optional[int] = None

两种都可以。我不明白它们之间有什么区别。


2
你看过 https://pydantic-docs.helpmanual.io/usage/models/#required-optional-fields 吗?在你的例子中它们可能没有区别,但有些情况下它们是不同的 - 比如将一个字段设为必填项,但允许值为 None / null(该字段是必填项,但值是可选的)。 - MatsLindh
1个回答

7
文档(请参见typing.Optional)中:

Optional[x] 简单来说就是 Union[x, None]

在 Pydantic 中,这意味着指定字段value变成了可选的。 换句话说,在初始化模型时不必传递字段和值,而值将默认为None (这与函数调用中描述的可选参数略有不同,详见此处)。
也不必明确指定None作为默认值。
在这种情况下,它似乎主要是一种语法糖,但它有助于使模型更易读。在更高级的情况下,可能需要显式要求将字段传递到模型中,即使值可能为None, 如在Required Optional Fields部分建议的那样,这时区分是必需的。
它始终取决于用例,但使用相同类型的默认值或使字段必填并非罕见。
以下是更常见的情况:
from pydantic import BaseModel
from typing import Optional

class Post(BaseModel):
    # rating is required and must be an integer.
    rating: int

    # counter is not required and will default to 1 if nothing is passed.
    counter: int = 1

    # comment is optional and will be coerced into a str.
    comment: Optional[str]

# This will work:
post = Post(rating=10)
repr(post)
# 'Post(rating=10, counter=1, comment=None)'

# This will work as well:
post = Post(rating=10, comment="some text")
repr(post)
# "Post(rating=10, counter=1, comment='some text')"

# But this won't work:
post = Post(comment="some text")

# ...
# ValidationError: 1 validation error for Post
# rating
#   field required (type=value_error.missing)

# And this won't work either:
post = Post(rating=10, counter=None)

# ...
# ValidationError: 1 validation error for Post1
# counter
#   none is not an allowed value (type=type_error.none.not_allowed)

3
这意味着该字段不是可选的,但其值可以选择为None或其他内容。 - Lee Meador

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接