我想知道有什么區別:
from pydantic import BaseModel, Field
class Person(BaseModel):
name: str = Field(..., min_length=1)
和:
from pydantic import BaseModel, constr
class Person(BaseModel):
name: constr(min_length=1)
兩者似乎都執行相同的驗證(甚至在name為空字串時引發完全相同的例外資訊)。這只是代碼風格的問題嗎?其中一個比另一個更受歡迎嗎?
另外,如果我想包含一個非空字串串列作為屬性,您認為以下哪種方式更好?:
from typing import List
from pydantic import BaseModel, constr
class Person(BaseModel):
languages: List[constr(min_length=1)]
或者:
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
編輯:FWIW,我將它用于 FastAPI 應用程式。
EDIT2:對于我的第二個問題,我認為第一個選擇更好,因為它包含架構中的長度要求(因此它在檔案中)
uj5u.com熱心網友回復:
constr 和 Fields 的目的不同。
constr 是一種特定型別,它提供有關此特定型別的驗證規則。您擁有所有經典 python 型別的等效項。
constr 的引數:
strip_whitespace: bool = False: removes leading and trailing whitespace
to_lower: bool = False: turns all characters to lowercase
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
正如您所看到的,這些引數允許您操作 str 本身,而不是使用該欄位操作 pydantic 的行為。
欄位的用途不同,它是自定義欄位的一種方式,所有欄位不僅是 str,它還添加了 18 個自定義變數,您可以在此處找到。
這只是代碼風格的問題嗎?其中一個比另一個更受歡迎嗎?
對于 str 的特定情況,這是代碼風格的問題,首選什么并不重要,只有您的用例才重要。
一般來說,最好不要將不同的語法混合在一起,因為你經常需要 Field(),你會經常找到它。
一個經典的用例是 api 回應,它以駝峰式或 PascalCase 發送 json 物件,您將使用欄位別名來匹配這些物件并使用它們在蛇形案例中的變數。
例子:
class Voice(BaseModel):
name: str = Field(None, alias='ActorName')
language_code: str = None
mood: str = None
在您的第二個問題中,您可以使用 field 來實作相同的行為。
from typing import List
from pydantic import BaseModel, Field
class Person(BaseModel):
languages: List[str] = Field(..., min_items=1)
如果您想了解有關限制和現場規則執行的更多資訊,請查看此內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/387442.html
