【问题标题】:Fastapi Pydantic optional fieldFastapi Pydantic 可选字段
【发布时间】:2022-01-21 10:52:14
【问题描述】:

目前,我正在学习 Python 和 Fastapi,但我无法弄清楚 typing.Optional 的用途。

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

两者都有效。我不明白有什么区别。

【问题讨论】:

  • 你见过pydantic-docs.helpmanual.io/usage/models/… 吗?在您的示例中,它们可能没有区别,但在某些情况下它们会有所不同 - 即,将字段设为必填,但允许 None / null 作为值(该字段是必需的,该值是可选的)

标签: python optional fastapi typing pydantic


【解决方案1】:

来自documentation(见typing.Optional):

Optional[x] 只是 Union[x, None] 的简写

在 Pydantic 中,这意味着该字段变为可选,在初始化模型时不需要传递任何内容,并且该字段将默认为 None(这与函数调用中的可选参数略有不同,如 @987654322 所述@)。

您也不需要明确指定 None 作为默认值。

在这种情况下,它似乎主要是语法糖,但它有助于使模型更具可读性。在更高级的情况下,您可能需要将一个字段显式传递到模型中,即使它可能是 None,正如 Require 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)

【讨论】:

    猜你喜欢
    • 2021-04-15
    • 1970-01-01
    • 2021-01-01
    • 2021-08-20
    • 1970-01-01
    • 2021-08-14
    • 2022-07-04
    • 2021-04-04
    • 1970-01-01
    相关资源
    最近更新 更多