asm*_*tin 19 python validation typing pydantic fastapi
我想知道以下之间有什么区别:
from pydantic import BaseModel, Field
class Person(BaseModel):
name: str = Field(..., min_length=1)
Run Code Online (Sandbox Code Playgroud)
和:
from pydantic import BaseModel, constr
class Person(BaseModel):
name: constr(min_length=1)
Run Code Online (Sandbox Code Playgroud)
name两者似乎都执行相同的验证(甚至在为空字符串时引发完全相同的异常信息)。这只是代码风格的问题吗?其中一个比另一个更受青睐吗?
另外,如果我想包含一个非空字符串列表作为属性,您认为以下哪种方式更好?:
from typing import List
from pydantic import BaseModel, constr
class Person(BaseModel):
languages: List[constr(min_length=1)]
Run Code Online (Sandbox Code Playgroud)
或者:
from typing import List
from pydantic import BaseModel, Field
class Person(BaseModel):
languages: List[str]
@validator('languages', each_item=True)
def check_nonempty_strings(cls, v):
if not v:
raise ValueError('Empty string is not a valid language.')
return v
Run Code Online (Sandbox Code Playgroud)
编辑:FWIW,我将其用于 FastAPI 应用程序。
编辑2:对于我的第二个问题,我认为第一个替代方案更好,因为它包含架构中的长度要求(因此它在文档中)
Bas*_*n B 15
constr 和 Fields 的用途不同。
constr 是一种特定类型,它给出了有关该特定类型的验证规则。所有经典 python 类型都有等效的。
strip_whitespace: bool = False: removes leading and trailing whitespace
to_lower: bool = False: turns all characters to lowercase
to_upper: bool = False: turns all characters to uppercase
strict: bool = False: controls type coercion
min_length: int = None: minimum length of the string
max_length: int = None: maximum length of the string
curtail_length: int = None: shrinks the string length to the set value when it is longer than the set value
regex: str = None: regex to validate the string against
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这些参数允许您操纵 str 本身,而不是 pydantic 与该字段的行为。
Field 的用途不同,它是自定义字段的一种方式,所有字段不仅是 str,它还添加了 18 个自定义变量,您可以在此处找到。
这只是代码风格的问题吗?其中一个比另一个更受青睐吗?
对于 str 的具体情况,这是代码风格的问题,首选什么并不重要,只有您的用例才重要。
一般来说,最好不要将不同的语法混合在一起,因为您经常需要Field(),所以您会经常找到它。
一个经典的用例是 api 响应,它以驼峰命名法或帕斯卡命名法发送 json 对象,您可以使用字段别名来匹配这些对象并在 Snake_case 中使用它们的变量。
例子:
class Voice(BaseModel):
name: str = Field(None, alias='ActorName')
language_code: str = None
mood: str = None
Run Code Online (Sandbox Code Playgroud)
我个人更喜欢使用 pydantic 类型来明确区分类型规则和字段注释。
基本示例:
class Car(BaseModel):
description: Union[constr(min_length=1, max_length=64), None] = Field(
default=None,
example="something",
description="Your car description",
)
Run Code Online (Sandbox Code Playgroud)
在任何情况下,您都应该只使用一种模型结构样式(字段、pydantic 类型或两者同时使用),以实现项目的全局一致性和更好的可读性。
对于你的第二个问题,你是对的,使用 constr 肯定是最好的方法,因为验证规则将被添加到 openapi 文档中。
如果您想了解有关限制和字段规则执行的更多信息,请查看此内容。
| 归档时间: |
|
| 查看次数: |
18810 次 |
| 最近记录: |